[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [calligra/calligra/2.9] /: Consistency: use ILIKE/NOT ILIKE operator instead of LIKE for PostgreSQL
From: Jaroslaw Staniek <staniek () kde ! org>
Date: 2015-05-31 20:57:28
Message-ID: E1YzAIS-0006yX-O3 () scm ! kde ! org
[Download RAW message or body]
Git commit 03b43ccbfd65c17362003047e7fec8ecef3c3bb7 by Jaroslaw Staniek.
Committed on 31/05/2015 at 20:01.
Pushed by staniek into branch 'calligra/2.9'.
Consistency: use ILIKE/NOT ILIKE operator instead of LIKE for PostgreSQL
This fixes the issue "PostgreSQL uses case-sensitive search for LIKE
SQL operator, Kexi's default is case-insensitive"
The approach isn't generic enough for other expressions (the context
of connection could be better) but it's already much better than ignoring
differences between servers
BUG:348203
REVIEW:123952
FIXED-IN:2.9.5
M +1 -0 kexi/kexidb/drivers/pqxx/pqxxdriver.cpp
M +12 -12 kexi/plugins/queries/kexiquerydesignerguieditor.cpp
M +1 -1 kexi/widget/tableview/kexicomboboxpopup.cpp
M +3 -3 libs/db/connection.cpp
M +1 -0 libs/db/driver.cpp
M +5 -0 libs/db/driver_p.h
M +32 -27 libs/db/expression.cpp
M +16 -12 libs/db/expression.h
M +2 -2 libs/db/parser/parser_p.cpp
http://commits.kde.org/calligra/03b43ccbfd65c17362003047e7fec8ecef3c3bb7
diff --git a/kexi/kexidb/drivers/pqxx/pqxxdriver.cpp \
b/kexi/kexidb/drivers/pqxx/pqxxdriver.cpp index 83f655c..f4119bb 100644
--- a/kexi/kexidb/drivers/pqxx/pqxxdriver.cpp
+++ b/kexi/kexidb/drivers/pqxx/pqxxdriver.cpp
@@ -49,6 +49,7 @@ pqxxSqlDriver::pqxxSqlDriver(QObject *parent, const QVariantList \
&args) beh->AUTO_INCREMENT_PK_FIELD_OPTION = "PRIMARY KEY";
beh->ALWAYS_AVAILABLE_DATABASE_NAME = "template1";
beh->QUOTATION_MARKS_FOR_IDENTIFIER = '"';
+ beh->LIKE_OPERATOR = "ILIKE";
initDriverSpecificKeywords(keywords);
//predefined properties
diff --git a/kexi/plugins/queries/kexiquerydesignerguieditor.cpp \
b/kexi/plugins/queries/kexiquerydesignerguieditor.cpp index 2943df6..2c80623 100644
--- a/kexi/plugins/queries/kexiquerydesignerguieditor.cpp
+++ b/kexi/plugins/queries/kexiquerydesignerguieditor.cpp
@@ -857,15 +857,15 @@ void \
KexiQueryDesignerGuiEditor::showFieldsOrRelationsForQueryInternal( if (!eItem)
continue;
- kDebug() << eItem->toString();
+ kDebug() << eItem->toString(0);
KexiDB::BinaryExpr* binary = eItem->toBinary();
if (binary && eItem->exprClass() == KexiDBExpr_Relational) {
KexiDB::Field *leftField = 0, *rightField = 0;
if (eItem->token() == '='
&& binary->left()->toVariable()
&& binary->right()->toVariable()
- && (leftField = \
query->findTableField(binary->left()->toString()))
- && (rightField = \
query->findTableField(binary->right()->toString()))) { + && \
(leftField = query->findTableField(binary->left()->toString(0))) + \
&& (rightField = query->findTableField(binary->right()->toString(0)))) { //! @todo \
move this check to parser on QuerySchema creation //! or to QuerySchema \
creation (WHERE expression should be then simplified //! by removing joins
@@ -921,7 +921,7 @@ void \
KexiQueryDesignerGuiEditor::showFieldsOrRelationsForQueryInternal( columnAlias = \
query->columnAlias(row_num); if (field->isExpression()) {
//! @todo ok? perhaps do not allow to omit aliases?
- fieldName = field->expression()->toString();
+ fieldName = field->expression()->toString(0);
}
else {
tableName = field->table()->name();
@@ -941,9 +941,9 @@ void \
KexiQueryDesignerGuiEditor::showFieldsOrRelationsForQueryInternal( if (criteriaExpr) \
{ //! @todo fix for !INFIX operators
if (criteriaExpr->token() == '=')
- criteriaString = criteriaArgument->toString();
+ criteriaString = criteriaArgument->toString(0);
else
- criteriaString = criteriaExpr->tokenToString() + " " + \
criteriaArgument->toString(); + criteriaString = \
criteriaExpr->tokenToString(0) + " " + criteriaArgument->toString(0); \
(*newRecord)[COLUMN_ID_CRITERIA] = criteriaString; }
d->dataTable->dataAwareObject()->insertItem(newRecord, row_num);
@@ -955,7 +955,7 @@ void \
KexiQueryDesignerGuiEditor::showFieldsOrRelationsForQueryInternal( \
set["criteria"].setValue(criteriaString, false); if (field->isExpression()) {
if (!d->changeSingleCellValue(*newRecord, COLUMN_ID_COLUMN,
- QVariant(columnAlias + ": " + \
field->expression()->toString()), &result)) + \
QVariant(columnAlias + ": " + field->expression()->toString(0)), &result)) return; \
//problems with setting column expression }
row_num++;
@@ -1050,9 +1050,9 @@ void \
KexiQueryDesignerGuiEditor::showFieldsOrRelationsForQueryInternal( if (criteriaExpr) \
{ //! @todo fix for !INFIX operators
if (criteriaExpr->token() == '=')
- criteriaString = criteriaArgument->toString();
+ criteriaString = criteriaArgument->toString(0);
else
- criteriaString = criteriaExpr->tokenToString() + " " + \
criteriaArgument->toString(); + criteriaString = \
criteriaExpr->tokenToString(0) + " " + criteriaArgument->toString(0); \
(*newRecord)[COLUMN_ID_CRITERIA] = criteriaString; }
d->dataTable->dataAwareObject()->insertItem(newRecord, row_num);
@@ -1494,7 +1494,7 @@ void \
KexiQueryDesignerGuiEditor::slotBeforeColumnCellChanged(KexiDB::RecordData if ((e = \
parseExpressionString(fieldName, dummyToken,
false/*allowRelationalOperator*/)))
{
- fieldName = e->toString(); //print it prettier
+ fieldName = e->toString(0); //print it prettier
//this is just checking: destroy expr. object
delete e;
}
@@ -1691,10 +1691,10 @@ void \
KexiQueryDesignerGuiEditor::slotBeforeCriteriaCellChanged(KexiDB::RecordDat QString \
tokenStr; if (token != '=') {
KexiDB::BinaryExpr be(KexiDBExpr_Relational, 0, token, 0);
- tokenStr = be.tokenToString() + " ";
+ tokenStr = be.tokenToString(0) + " ";
}
if (set) {
- (*set)["criteria"] = QString(tokenStr + e->toString()); //print it \
prettier + (*set)["criteria"] = QString(tokenStr + e->toString(0)); \
//print it prettier }
//this is just checking: destroy expr. object
delete e;
diff --git a/kexi/widget/tableview/kexicomboboxpopup.cpp \
b/kexi/widget/tableview/kexicomboboxpopup.cpp index 1a0e0ec..1ff26be 100644
--- a/kexi/widget/tableview/kexicomboboxpopup.cpp
+++ b/kexi/widget/tableview/kexicomboboxpopup.cpp
@@ -281,7 +281,7 @@ void KexiComboBoxPopup::setData(KexiDB::TableViewColumn *column, \
KexiDB::Field * expr = fieldExpr;
}
expr->debug();
- kDebug() << expr->toString();
+ kDebug() << expr->toString(0);
KexiDB::Field *f = new KexiDB::Field();
f->setExpression(expr);
diff --git a/libs/db/connection.cpp b/libs/db/connection.cpp
index af245ef..3ffb069 100644
--- a/libs/db/connection.cpp
+++ b/libs/db/connection.cpp
@@ -1260,7 +1260,7 @@ QString KexiDB::selectStatement(const KexiDB::Driver *driver,
sql += QLatin1Char('*');
} else {
if (f->isExpression()) {
- sql += f->expression()->toString();
+ sql += f->expression()->toString(driver);
} else {
if (!f->table()) //sanity check
return QString();
@@ -1495,9 +1495,9 @@ QString KexiDB::selectStatement(const KexiDB::Driver *driver,
QuerySchemaParameterValueListIterator *paramValuesItPtr = params.isEmpty() ? \
0 : ¶mValuesIt; if (wasWhere) {
//TODO: () are not always needed
- s_where = '(' + s_where + ") AND (" + \
querySchema.whereExpression()->toString(paramValuesItPtr) + ')'; + s_where \
= '(' + s_where + ") AND (" + querySchema.whereExpression()->toString(driver, \
paramValuesItPtr) + ')'; } else {
- s_where = querySchema.whereExpression()->toString(paramValuesItPtr);
+ s_where = querySchema.whereExpression()->toString(driver, \
paramValuesItPtr); }
}
if (!s_where.isEmpty())
diff --git a/libs/db/driver.cpp b/libs/db/driver.cpp
index c1277a8..248d5d7 100644
--- a/libs/db/driver.cpp
+++ b/libs/db/driver.cpp
@@ -67,6 +67,7 @@ DriverBehaviour::DriverBehaviour()
, _1ST_ROW_READ_AHEAD_REQUIRED_TO_KNOW_IF_THE_RESULT_IS_EMPTY(false)
, SELECT_1_SUBQUERY_SUPPORTED(false)
, TEXT_TYPE_MAX_LENGTH(0)
+ , LIKE_OPERATOR("LIKE")
{
}
diff --git a/libs/db/driver_p.h b/libs/db/driver_p.h
index 4cdfb5b..d376ae0 100644
--- a/libs/db/driver_p.h
+++ b/libs/db/driver_p.h
@@ -141,6 +141,11 @@ public:
This is the case for MySQL.
The default is 0. */
uint TEXT_TYPE_MAX_LENGTH;
+
+ /*! "LIKE" by default, used to construct native expressions "x LIKE y" and "x \
NOT LIKE y". + LIKE is case-insensitive for MySQL, SQLite, and often on \
Sybase/MSSQL + while for PostgreSQL it's case-sensitive. So for PostgreSQL \
LIKE_OPERATOR == "ILIKE". */ + QString LIKE_OPERATOR;
};
/*! Private driver's data members. Available for implementation. */
diff --git a/libs/db/expression.cpp b/libs/db/expression.cpp
index 794732e..79d3e00 100644
--- a/libs/db/expression.cpp
+++ b/libs/db/expression.cpp
@@ -22,6 +22,7 @@
#include "expression.h"
#include "utils.h"
+#include "driver_p.h"
#include "parser/sqlparser.h"
#include "parser/parser_p.h"
@@ -126,8 +127,9 @@ QString BaseExpr::tokenToDebugString(int token)
return QLatin1String(tokenName(token));
}
-QString BaseExpr::tokenToString()
+QString BaseExpr::tokenToString(const Driver *driver)
{
+ Q_UNUSED(driver);
if (m_token < 255 && isprint(m_token))
return tokenToDebugString();
return QString();
@@ -232,7 +234,7 @@ bool NArgExpr::containsNullArgument()
QString NArgExpr::debugString()
{
QString s = QString("NArgExpr(")
- + tokenToString() + ", " + "class=" + exprClassName(m_cl);
+ + tokenToString(0) + ", " + "class=" + exprClassName(m_cl);
foreach(BaseExpr *expr, list) {
s += ", " +
expr->debugString();
@@ -241,13 +243,13 @@ QString NArgExpr::debugString()
return s;
}
-QString NArgExpr::toString(QuerySchemaParameterValueListIterator* params)
+QString NArgExpr::toString(const Driver *driver, \
QuerySchemaParameterValueListIterator* params) {
if (BaseExpr::token() == KEXIDB_TOKEN_BETWEEN_AND && list.count() == 3) {
- return list[0]->toString() + " BETWEEN " + list[1]->toString() + " AND " + \
list[2]->toString(); + return list[0]->toString(driver) + " BETWEEN " + \
list[1]->toString(driver) + " AND " + list[2]->toString(driver); }
if (BaseExpr::token() == KEXIDB_TOKEN_NOT_BETWEEN_AND && list.count() == 3) {
- return list[0]->toString() + " NOT BETWEEN " + list[1]->toString() + " AND " \
+ list[2]->toString(); + return list[0]->toString(driver) + " NOT BETWEEN " + \
list[1]->toString(driver) + " AND " + list[2]->toString(driver); }
QString s;
@@ -255,7 +257,7 @@ QString NArgExpr::toString(QuerySchemaParameterValueListIterator* \
params) foreach(BaseExpr* e, list) {
if (!s.isEmpty())
s += ", ";
- s += e->toString(params);
+ s += e->toString(driver, params);
}
return s;
}
@@ -329,13 +331,13 @@ bool NArgExpr::validate(ParseInfo& parseInfo)
return true;
}
-QString NArgExpr::tokenToString()
+QString NArgExpr::tokenToString(const Driver *driver)
{
switch (m_token) {
case KEXIDB_TOKEN_BETWEEN_AND: return "BETWEEN_AND";
case KEXIDB_TOKEN_NOT_BETWEEN_AND: return "NOT_BETWEEN_AND";
default: {
- const QString s = BaseExpr::tokenToString();
+ const QString s = BaseExpr::tokenToString(driver);
if (!s.isEmpty()) {
return QString("'%1'").arg(s);
}
@@ -380,19 +382,19 @@ QString UnaryExpr::debugString()
+ QString(",type=%1)").arg(Driver::defaultSQLTypeName(type()));
}
-QString UnaryExpr::toString(QuerySchemaParameterValueListIterator* params)
+QString UnaryExpr::toString(const Driver *driver, \
QuerySchemaParameterValueListIterator* params) {
if (m_token == '(') //parentheses (special case)
- return '(' + (m_arg ? m_arg->toString(params) : "<NULL>") + ')';
+ return '(' + (m_arg ? m_arg->toString(driver, params) : "<NULL>") + ')';
if (m_token < 255 && isprint(m_token))
- return tokenToDebugString() + (m_arg ? m_arg->toString(params) : "<NULL>");
+ return tokenToDebugString() + (m_arg ? m_arg->toString(driver, params) : \
"<NULL>"); if (m_token == NOT)
- return "NOT " + (m_arg ? m_arg->toString(params) : "<NULL>");
+ return "NOT " + (m_arg ? m_arg->toString(driver, params) : "<NULL>");
if (m_token == SQL_IS_NULL)
- return (m_arg ? m_arg->toString(params) : "<NULL>") + " IS NULL";
+ return (m_arg ? m_arg->toString(driver, params) : "<NULL>") + " IS NULL";
if (m_token == SQL_IS_NOT_NULL)
- return (m_arg ? m_arg->toString(params) : "<NULL>") + " IS NOT NULL";
- return QString("{INVALID_OPERATOR#%1} ").arg(m_token) + (m_arg ? \
m_arg->toString(params) : "<NULL>"); + return (m_arg ? m_arg->toString(driver, \
params) : "<NULL>") + " IS NOT NULL"; + return QString("{INVALID_OPERATOR#%1} \
").arg(m_token) + (m_arg ? m_arg->toString(driver, params) : "<NULL>"); }
void UnaryExpr::getQueryParameters(QuerySchemaParameterList& params)
@@ -551,7 +553,7 @@ QString BinaryExpr::debugString()
+ QString::fromLatin1(",type=%1)").arg(Driver::defaultSQLTypeName(type()));
}
-QString BinaryExpr::tokenToString()
+QString BinaryExpr::tokenToString(const Driver *driver)
{
if (m_token < 255 && isprint(m_token))
return tokenToDebugString();
@@ -564,8 +566,8 @@ QString BinaryExpr::tokenToString()
case NOT_EQUAL2: return "!=";
case LESS_OR_EQUAL: return "<=";
case GREATER_OR_EQUAL: return ">=";
- case LIKE: return "LIKE";
- case NOT_LIKE: return "NOT LIKE";
+ case LIKE: return driver ? driver->behaviour()->LIKE_OPERATOR : "LIKE";
+ case NOT_LIKE: return driver ? (QString::fromLatin1("NOT ") + \
driver->behaviour()->LIKE_OPERATOR) : QString::fromLatin1("NOT LIKE"); case SQL_IN: \
return "IN"; // other logical operations: OR (or ||) AND (or &&) XOR
case SIMILAR_TO: return "SIMILAR TO";
@@ -582,11 +584,11 @@ QString BinaryExpr::tokenToString()
return QString("{INVALID_BINARY_OPERATOR#%1} ").arg(m_token);
}
-QString BinaryExpr::toString(QuerySchemaParameterValueListIterator* params)
+QString BinaryExpr::toString(const Driver *driver, \
QuerySchemaParameterValueListIterator* params) {
#define INFIX(a) \
- (m_larg ? m_larg->toString(params) : "<NULL>") + ' ' + a + ' ' + (m_rarg ? \
m_rarg->toString(params) : "<NULL>")
- return INFIX(tokenToString());
+ (m_larg ? m_larg->toString(driver, params) : "<NULL>") + ' ' + a + ' ' + (m_rarg \
? m_rarg->toString(driver, params) : "<NULL>") + return \
INFIX(tokenToString(driver)); }
void BinaryExpr::getQueryParameters(QuerySchemaParameterList& params)
@@ -659,12 +661,13 @@ Field::Type ConstExpr::type()
QString ConstExpr::debugString()
{
- return QString("ConstExpr('") + tokenToDebugString() + "'," + toString()
+ return QString("ConstExpr('") + tokenToDebugString() + "'," + toString(0)
+ QString(",type=%1)").arg(Driver::defaultSQLTypeName(type()));
}
-QString ConstExpr::toString(QuerySchemaParameterValueListIterator* params)
+QString ConstExpr::toString(const Driver *driver, \
QuerySchemaParameterValueListIterator* params) {
+ Q_UNUSED(driver);
Q_UNUSED(params);
if (m_token == SQL_NULL)
return "NULL";
@@ -736,8 +739,9 @@ QString QueryParameterExpr::debugString()
+ QString("',type=%1)").arg(Driver::defaultSQLTypeName(type()));
}
-QString QueryParameterExpr::toString(QuerySchemaParameterValueListIterator* params)
+QString QueryParameterExpr::toString(const Driver *driver, \
QuerySchemaParameterValueListIterator* params) {
+ Q_UNUSED(driver);
return params ? params->getPreviousValueAsString(type()) : \
QString::fromLatin1("[%2]").arg(value.toString()); }
@@ -790,8 +794,9 @@ QString VariableExpr::debugString()
+ QString(",type=%1)").arg(field ? Driver::defaultSQLTypeName(type()) : \
QString("FIELD NOT DEFINED YET")); }
-QString VariableExpr::toString(QuerySchemaParameterValueListIterator* params)
+QString VariableExpr::toString(const Driver *driver, \
QuerySchemaParameterValueListIterator* params) {
+ Q_UNUSED(driver);
Q_UNUSED(params);
return name;
}
@@ -1012,9 +1017,9 @@ QString FunctionExpr::debugString()
return res;
}
-QString FunctionExpr::toString(QuerySchemaParameterValueListIterator* params)
+QString FunctionExpr::toString(const Driver *driver, \
QuerySchemaParameterValueListIterator* params) {
- return name + '(' + (args ? args->toString(params) : QString()) + ')';
+ return name + '(' + (args ? args->toString(driver, params) : QString()) + ')';
}
void FunctionExpr::getQueryParameters(QuerySchemaParameterList& params)
diff --git a/libs/db/expression.h b/libs/db/expression.h
index a7b0410..c3c368d 100644
--- a/libs/db/expression.h
+++ b/libs/db/expression.h
@@ -125,8 +125,12 @@ public:
/*! \return string as a representation of this expression element by running \
recursive calls.
\a param, if not 0, points to a list item containing value of a query parameter
- (used in QueryParameterExpr). */
- virtual QString toString(QuerySchemaParameterValueListIterator* params = 0) = 0;
+ (used in QueryParameterExpr).
+ \a driver if present can be used to obtain information useful while generating \
native statement strings. + For example PostgreSQL uses ILIKE while other drivers \
use LIKE operator. + For generating KEXISQL \a driver is always 0.
+ @todo connection should be provided here as a context, not driver. */
+ virtual QString toString(const Driver *driver, \
QuerySchemaParameterValueListIterator* params = 0) = 0;
/*! Collects query parameters (messages and types) reculsively and saves them to \
params. The leaf nodes are objects of QueryParameterExpr class. */
@@ -147,7 +151,7 @@ public:
static QString tokenToDebugString(int token);
/*! \return string for token, like "<=" or ">" */
- virtual QString tokenToString();
+ virtual QString tokenToString(const Driver *driver);
int exprClass() const {
return m_cl;
@@ -187,10 +191,10 @@ public:
BaseExpr *arg(int n);
int args();
virtual QString debugString();
- virtual QString toString(QuerySchemaParameterValueListIterator* params = 0);
+ virtual QString toString(const Driver *driver, \
QuerySchemaParameterValueListIterator* params = 0); virtual void \
getQueryParameters(QuerySchemaParameterList& params); virtual bool \
validate(ParseInfo& parseInfo);
- virtual QString tokenToString();
+ virtual QString tokenToString(const Driver *driver);
BaseExpr::List list;
};
@@ -206,7 +210,7 @@ public:
virtual UnaryExpr* copy() const;
virtual Field::Type type();
virtual QString debugString();
- virtual QString toString(QuerySchemaParameterValueListIterator* params = 0);
+ virtual QString toString(const Driver *driver, \
QuerySchemaParameterValueListIterator* params = 0); virtual void \
getQueryParameters(QuerySchemaParameterList& params); BaseExpr *arg() const {
return m_arg;
@@ -234,7 +238,7 @@ public:
virtual BinaryExpr* copy() const;
virtual Field::Type type();
virtual QString debugString();
- virtual QString toString(QuerySchemaParameterValueListIterator* params = 0);
+ virtual QString toString(const Driver *driver, \
QuerySchemaParameterValueListIterator* params = 0); virtual void \
getQueryParameters(QuerySchemaParameterList& params); BaseExpr *left() const {
return m_larg;
@@ -243,7 +247,7 @@ public:
return m_rarg;
}
virtual bool validate(ParseInfo& parseInfo);
- virtual QString tokenToString();
+ virtual QString tokenToString(const Driver *driver);
BaseExpr *m_larg;
BaseExpr *m_rarg;
@@ -262,7 +266,7 @@ public:
virtual ConstExpr* copy() const;
virtual Field::Type type();
virtual QString debugString();
- virtual QString toString(QuerySchemaParameterValueListIterator* params = 0);
+ virtual QString toString(const Driver *driver, \
QuerySchemaParameterValueListIterator* params = 0); virtual void \
getQueryParameters(QuerySchemaParameterList& params); virtual bool \
validate(ParseInfo& parseInfo); QVariant value;
@@ -289,7 +293,7 @@ public:
*/
void setType(Field::Type type);
virtual QString debugString();
- virtual QString toString(QuerySchemaParameterValueListIterator* params = 0);
+ virtual QString toString(const Driver *driver, \
QuerySchemaParameterValueListIterator* params = 0); virtual void \
getQueryParameters(QuerySchemaParameterList& params); virtual bool \
validate(ParseInfo& parseInfo); protected:
@@ -307,7 +311,7 @@ public:
virtual VariableExpr* copy() const;
virtual Field::Type type();
virtual QString debugString();
- virtual QString toString(QuerySchemaParameterValueListIterator* params = 0);
+ virtual QString toString(const Driver *driver, \
QuerySchemaParameterValueListIterator* params = 0); virtual void \
getQueryParameters(QuerySchemaParameterList& params);
/*! Validation. Sets field, tablePositionForField
@@ -351,7 +355,7 @@ public:
virtual FunctionExpr* copy() const;
virtual Field::Type type();
virtual QString debugString();
- virtual QString toString(QuerySchemaParameterValueListIterator* params = 0);
+ virtual QString toString(const Driver *driver, \
QuerySchemaParameterValueListIterator* params = 0); virtual void \
getQueryParameters(QuerySchemaParameterList& params); virtual bool \
validate(ParseInfo& parseInfo);
diff --git a/libs/db/parser/parser_p.cpp b/libs/db/parser/parser_p.cpp
index 5f11f4e..3d3064a 100644
--- a/libs/db/parser/parser_p.cpp
+++ b/libs/db/parser/parser_p.cpp
@@ -346,7 +346,7 @@ QuerySchema* buildSelectQuery(
aliasVariable = e->toBinary()->right()->toVariable();
if (!aliasVariable) {
setError(i18n("Invalid alias definition for column \"%1\".",
- columnExpr->toString())); //ok?
+ columnExpr->toString(0))); //ok?
break;
}
}
@@ -372,7 +372,7 @@ QuerySchema* buildSelectQuery(
//take first (left) argument of the special binary expr, will be \
owned, do not destroy e->toBinary()->m_larg = 0;
} else {
- setError(i18n("Invalid \"%1\" column definition.", e->toString())); \
//ok? + setError(i18n("Invalid \"%1\" column definition.", \
e->toString(0))); //ok? break;
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic