From 5193c14536fafc57c860e9e234e21ddc29d5b6b0 Mon Sep 17 00:00:00 2001 From: Israel Lins Albuquerque Date: Mon, 4 Nov 2013 19:45:28 -0200 Subject: fix parsing of bound SQL statements for PostgreSQL PostgreSQL allows bound variables inside square braces. Task-number: QTBUG-34541 Change-Id: I4f069b3f1078d4cdf172fbac9e0d7d23d20d167a Reviewed-by: Mark Brand --- src/sql/kernel/qsqldriver.h | 1 + src/sql/kernel/qsqlresult.cpp | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'src/sql') diff --git a/src/sql/kernel/qsqldriver.h b/src/sql/kernel/qsqldriver.h index 017ffd4e4a..f93a03063b 100644 --- a/src/sql/kernel/qsqldriver.h +++ b/src/sql/kernel/qsqldriver.h @@ -62,6 +62,7 @@ class QVariant; class Q_SQL_EXPORT QSqlDriver : public QObject { friend class QSqlDatabase; + friend class QSqlResultPrivate; Q_OBJECT Q_DECLARE_PRIVATE(QSqlDriver) diff --git a/src/sql/kernel/qsqlresult.cpp b/src/sql/kernel/qsqlresult.cpp index 953e2ca66e..31b05ab9e9 100644 --- a/src/sql/kernel/qsqlresult.cpp +++ b/src/sql/kernel/qsqlresult.cpp @@ -51,6 +51,7 @@ #include "qsqldriver.h" #include "qpointer.h" #include "qsqlresult_p.h" +#include "private/qsqldriver_p.h" #include QT_BEGIN_NAMESPACE @@ -89,6 +90,7 @@ QString QSqlResultPrivate::positionalToNamedBinding(const QString &query) const result.reserve(n * 5 / 4); QChar closingQuote; int count = 0; + bool ignoreBraces = (sqldriver->d_func()->dbmsType == QSqlDriverPrivate::PostgreSQL); for (int i = 0; i < n; ++i) { QChar ch = query.at(i); @@ -110,7 +112,7 @@ QString QSqlResultPrivate::positionalToNamedBinding(const QString &query) const } else { if (ch == QLatin1Char('\'') || ch == QLatin1Char('"') || ch == QLatin1Char('`')) closingQuote = ch; - else if (ch == QLatin1Char('[')) + else if (!ignoreBraces && ch == QLatin1Char('[')) closingQuote = QLatin1Char(']'); result += ch; } @@ -129,6 +131,7 @@ QString QSqlResultPrivate::namedToPositionalBinding(const QString &query) QChar closingQuote; int count = 0; int i = 0; + bool ignoreBraces = (sqldriver->d_func()->dbmsType == QSqlDriverPrivate::PostgreSQL); while (i < n) { QChar ch = query.at(i); @@ -160,7 +163,7 @@ QString QSqlResultPrivate::namedToPositionalBinding(const QString &query) } else { if (ch == QLatin1Char('\'') || ch == QLatin1Char('"') || ch == QLatin1Char('`')) closingQuote = ch; - else if (ch == QLatin1Char('[')) + else if (!ignoreBraces && ch == QLatin1Char('[')) closingQuote = QLatin1Char(']'); result += ch; ++i; -- cgit v1.2.3