diff options
Diffstat (limited to 'src/sql/drivers')
-rw-r--r-- | src/sql/drivers/odbc/qsql_odbc.cpp | 2 | ||||
-rw-r--r-- | src/sql/drivers/psql/qsql_psql.cpp | 38 | ||||
-rw-r--r-- | src/sql/drivers/sqlite/qsql_sqlite.cpp | 3 |
3 files changed, 35 insertions, 8 deletions
diff --git a/src/sql/drivers/odbc/qsql_odbc.cpp b/src/sql/drivers/odbc/qsql_odbc.cpp index a7f583c3b8..f0f1f64141 100644 --- a/src/sql/drivers/odbc/qsql_odbc.cpp +++ b/src/sql/drivers/odbc/qsql_odbc.cpp @@ -1407,7 +1407,7 @@ bool QODBCResult::exec() // (How many leading digits do we want to keep? With SQL Server 2005, this should be 3: 123000000) int keep = (int)qPow(10.0, 9 - qMin(9, precision)); - dt->fraction /= keep * keep; + dt->fraction = (dt->fraction / keep) * keep; } r = SQLBindParameter(d->hStmt, diff --git a/src/sql/drivers/psql/qsql_psql.cpp b/src/sql/drivers/psql/qsql_psql.cpp index 7d844fa1bd..4749b8b97b 100644 --- a/src/sql/drivers/psql/qsql_psql.cpp +++ b/src/sql/drivers/psql/qsql_psql.cpp @@ -124,7 +124,16 @@ inline void qPQfreemem(void *buffer) class QPSQLDriverPrivate { public: - QPSQLDriverPrivate(QPSQLDriver *qq) : q(qq), connection(0), isUtf8(false), pro(QPSQLDriver::Version6), sn(0), pendingNotifyCheck(false) {} + QPSQLDriverPrivate(QPSQLDriver *qq) + : q(qq), + connection(0), + isUtf8(false), + pro(QPSQLDriver::Version6), + sn(0), + pendingNotifyCheck(false), + hasBackslashEscape(false) + { } + QPSQLDriver *q; PGconn *connection; bool isUtf8; @@ -132,6 +141,7 @@ public: QSocketNotifier *sn; QStringList seid; mutable bool pendingNotifyCheck; + bool hasBackslashEscape; void appendTables(QStringList &tl, QSqlQuery &t, QChar type); PGresult * exec(const char * stmt) const; @@ -139,6 +149,7 @@ public: QPSQLDriver::Protocol getPSQLVersion(); bool setEncodingUtf8(); void setDatestyle(); + void detectBackslashEscape(); }; void QPSQLDriverPrivate::appendTables(QStringList &tl, QSqlQuery &t, QChar type) @@ -621,6 +632,23 @@ void QPSQLDriverPrivate::setDatestyle() PQclear(result); } +void QPSQLDriverPrivate::detectBackslashEscape() +{ + // standard_conforming_strings option introduced in 8.2 + // http://www.postgresql.org/docs/8.2/static/runtime-config-compatible.html + if (pro < QPSQLDriver::Version82) { + hasBackslashEscape = true; + } else { + hasBackslashEscape = false; + PGresult* result = exec(QLatin1Literal("SELECT '\\\\' x")); + int status = PQresultStatus(result); + if (status == PGRES_COMMAND_OK || status == PGRES_TUPLES_OK) + if (QString::fromLatin1(PQgetvalue(result, 0, 0)) == QLatin1Literal("\\")) + hasBackslashEscape = true; + PQclear(result); + } +} + static QPSQLDriver::Protocol qMakePSQLVersion(int vMaj, int vMin) { switch (vMaj) { @@ -732,6 +760,7 @@ QPSQLDriver::QPSQLDriver(PGconn *conn, QObject *parent) d->connection = conn; if (conn) { d->pro = d->getPSQLVersion(); + d->detectBackslashEscape(); setOpen(true); setOpenError(false); } @@ -833,6 +862,7 @@ bool QPSQLDriver::open(const QString & db, } d->pro = d->getPSQLVersion(); + d->detectBackslashEscape(); d->isUtf8 = d->setEncodingUtf8(); d->setDatestyle(); @@ -1218,12 +1248,10 @@ QString QPSQLDriver::formatValue(const QSqlField &field, bool trimStrings) const } break; case QVariant::String: - { - // Escape '\' characters r = QSqlDriver::formatValue(field, trimStrings); - r.replace(QLatin1String("\\"), QLatin1String("\\\\")); + if (d->hasBackslashEscape) + r.replace(QLatin1String("\\"), QLatin1String("\\\\")); break; - } case QVariant::Bool: if (field.value().toBool()) r = QLatin1String("TRUE"); diff --git a/src/sql/drivers/sqlite/qsql_sqlite.cpp b/src/sql/drivers/sqlite/qsql_sqlite.cpp index 1af5d6274e..854705b3f6 100644 --- a/src/sql/drivers/sqlite/qsql_sqlite.cpp +++ b/src/sql/drivers/sqlite/qsql_sqlite.cpp @@ -234,8 +234,7 @@ void QSQLiteResultPrivate::initColumns(bool emptyResultset) } } - int dotIdx = colName.lastIndexOf(QLatin1Char('.')); - QSqlField fld(colName.mid(dotIdx == -1 ? 0 : dotIdx + 1), fieldType); + QSqlField fld(colName, fieldType); fld.setSqlType(stp); rInf.append(fld); } |