diff --git a/autotests/ExpressionsTest.h b/autotests/ExpressionsTest.h --- a/autotests/ExpressionsTest.h +++ b/autotests/ExpressionsTest.h @@ -46,6 +46,8 @@ void testBinaryExpressionValidate(); void testFunctionExpressionValidate(); + void testResolveQuotedIdentifiers(); + void cleanupTestCase(); }; diff --git a/autotests/ExpressionsTest.cpp b/autotests/ExpressionsTest.cpp --- a/autotests/ExpressionsTest.cpp +++ b/autotests/ExpressionsTest.cpp @@ -23,6 +23,8 @@ #include #include +#include +#include #include "parser/generated/sqlparser.h" #include "parser/KDbParser_p.h" @@ -1495,6 +1497,78 @@ QVERIFY(!validate(&f_noname)); } +void ExpressionsTest::testResolveQuotedIdentifiers() +{ + KDbTableSchema tableSchema("tests"); + tableSchema.addField(new KDbField("column", KDbField::BigInteger)); + KDbQuerySchema querySchema(&tableSchema); + KDbParseInfoInternal parseInfo(&querySchema); + + KDbQueryParameterExpression toResolve("column"); + QVERIFY2(toResolve.resolveQuotedIdentifiers(&parseInfo).isVariable(), + "Query parameter should be changed to variable expression when column exists"); + + KDbQueryParameterExpression toKeep("another"); + QVERIFY2(toKeep.resolveQuotedIdentifiers(&parseInfo).isQueryParameter(), + "Query parameter should remain the same when column does not exist"); + + KDbBinaryExpression binaryLeftColumn(KDbQueryParameterExpression ("column"), + KDbToken('+'), + KDbQueryParameterExpression("right")); + KDbExpression resolvedLeftColumn = binaryLeftColumn.resolveQuotedIdentifiers(&parseInfo); + QVERIFY2(resolvedLeftColumn.isBinary(), "The binary expression itself should not change"); + QVERIFY(resolvedLeftColumn.toBinary().left().isVariable()); + QVERIFY(resolvedLeftColumn.toBinary().right().isQueryParameter()); + + KDbBinaryExpression binaryRightColumn(KDbQueryParameterExpression ("left"), + KDbToken('+'), + KDbQueryParameterExpression("column")); + KDbExpression resolvedRightColumn = binaryRightColumn.resolveQuotedIdentifiers(&parseInfo); + QVERIFY(resolvedRightColumn.isBinary()); + QVERIFY(resolvedRightColumn.toBinary().left().isQueryParameter()); + QVERIFY(resolvedRightColumn.toBinary().right().isVariable()); + + KDbUnaryExpression unaryColumn(KDbToken('-'), KDbQueryParameterExpression("column")); + KDbExpression resolvedUnaryColumn = unaryColumn.resolveQuotedIdentifiers(&parseInfo); + QVERIFY2(resolvedUnaryColumn.isUnary(), "The unary expression itself should not change"); + QVERIFY(resolvedUnaryColumn.toUnary().arg().isVariable()); + + KDbUnaryExpression unaryParameter(KDbToken('-'), KDbQueryParameterExpression("arg")); + KDbExpression resolvedUnaryParameter = unaryParameter.resolveQuotedIdentifiers(&parseInfo); + QVERIFY(resolvedUnaryParameter.isUnary()); + QVERIFY(resolvedUnaryParameter.toUnary().arg().isQueryParameter()); + + KDbNArgExpression nargExpression(KDb::FieldListExpression, KDbToken()); + nargExpression.append(KDbQueryParameterExpression("first")); + nargExpression.append(KDbQueryParameterExpression("column")); + nargExpression.append(KDbQueryParameterExpression("middle")); + nargExpression.append(KDbQueryParameterExpression("column")); + nargExpression.append(KDbQueryParameterExpression("last")); + KDbExpression resolvedNArg = nargExpression.resolveQuotedIdentifiers(&parseInfo); + QVERIFY2(resolvedNArg.isNArg(), "The narg expression itself should not change"); + QVERIFY(resolvedNArg.toNArg().arg(0).isQueryParameter()); + QVERIFY(resolvedNArg.toNArg().arg(1).isVariable()); + QVERIFY(resolvedNArg.toNArg().arg(2).isQueryParameter()); + QVERIFY(resolvedNArg.toNArg().arg(3).isVariable()); + QVERIFY(resolvedNArg.toNArg().arg(4).isQueryParameter()); + + KDbUnaryExpression deep(KDbToken('-'), + KDbBinaryExpression(KDbBinaryExpression(KDbQueryParameterExpression("column"), + KDbToken('*'), + KDbQueryParameterExpression("no")), + KDbToken('+'), + KDbBinaryExpression(KDbQueryParameterExpression("nope"), + KDbToken('/'), + KDbQueryParameterExpression("column")) + ) + ); + KDbUnaryExpression resolvedDeep = deep.resolveQuotedIdentifiers(&parseInfo).toUnary(); + QVERIFY(resolvedDeep.arg().toBinary().left().toBinary().left().isVariable()); + QVERIFY(resolvedDeep.arg().toBinary().left().toBinary().right().isQueryParameter()); + QVERIFY(resolvedDeep.arg().toBinary().right().toBinary().left().isQueryParameter()); + QVERIFY(resolvedDeep.arg().toBinary().right().toBinary().right().isVariable()); +} + void ExpressionsTest::cleanupTestCase() { } diff --git a/autotests/OrderByColumnTest.cpp b/autotests/OrderByColumnTest.cpp --- a/autotests/OrderByColumnTest.cpp +++ b/autotests/OrderByColumnTest.cpp @@ -70,11 +70,11 @@ // change alias to something other than valid ID QVERIFY(query.setColumnAlias(indexOfField, "0")); QVERIFY(utils.kdbBuilder()->generateSelectStatement(&sql, &query)); - QCOMPARE(sql, "SELECT 'foo' AS \"0\" ORDER BY \"0\""); + QCOMPARE(sql, "SELECT 'foo' AS [0] ORDER BY [0]"); orderBySqlOldApi = orderBy->toSqlString(true, conn, KDb::KDbEscaping); QCOMPARE(orderBySqlOldApi, ""); // alias is not used orderBySql = orderBy->toSqlString(true, conn, &query, KDb::KDbEscaping); - QCOMPARE(orderBySql, "\"0\""); // alias is used to point to the column "'foo'" + QCOMPARE(orderBySql, "[0]"); // alias is used to point to the column "'foo'" } void OrderByColumnTest::testOrderByIndex() diff --git a/autotests/parser/SqlParserTest.cpp b/autotests/parser/SqlParserTest.cpp --- a/autotests/parser/SqlParserTest.cpp +++ b/autotests/parser/SqlParserTest.cpp @@ -263,6 +263,7 @@ QVERIFY2(ok, "Failed to generate KDbSQL statement from query"); //! @todo compare with template + // 3.1. Parse the generated KDbSQL again ok = parser->parse(querySql); QScopedPointer secondQuery(parser->query()); @@ -321,9 +322,9 @@ QCOMPARE(KDbToken::DATETIME_CONST.value(), 291); QCOMPARE(KDbToken::TIME_CONST.value(), 292); QCOMPARE(KDbToken::TABLE.value(), 293); - QCOMPARE(KDbToken::IDENTIFIER.value(), 294); + QCOMPARE(KDbToken::UNQUOTED_IDENTIFIER.value(), 294); QCOMPARE(KDbToken::IDENTIFIER_DOT_ASTERISK.value(), 295); - QCOMPARE(KDbToken::QUERY_PARAMETER.value(), 296); + QCOMPARE(KDbToken::IDENTIFIER_OR_QUERY_PARAMETER.value(), 296); QCOMPARE(KDbToken::VARCHAR.value(), 297); QCOMPARE(KDbToken::WHERE.value(), 298); QCOMPARE(KDbToken::SQL.value(), 299); diff --git a/autotests/parser/data/statements.txt b/autotests/parser/data/statements.txt --- a/autotests/parser/data/statements.txt +++ b/autotests/parser/data/statements.txt @@ -324,10 +324,16 @@ SELECT * FROM table; SELECT id FROM table; SELECT [id] FROM table; +SELECT table.* FROM table; +SELECT table.id FROM table; +SELECT table.[id] FROM table; -- Identifier escaping SELECT * FROM [table]; SELECT id FROM [table]; SELECT [id] FROM [table]; +SELECT [table].* FROM [table]; +SELECT [table].id FROM [table]; +SELECT [table].[id] FROM [table]; -- IS NULL/IS NOT NULL select 1 IS NOT NULL; select NULL IS NULL; @@ -446,14 +452,34 @@ -- Aliases for columns select id myid from persons; select id as myid from persons; +select [id] [select] from persons; +select [id] as [select] from persons; +select id [select] from persons; +select id as [select] from persons; +select [id] myid from persons; +select [id] as myid from persons; +select id as [1st] from persons; +select id as [a column] from persons; +select id as [カラム] from persons; -- Aliases for tables select id from persons p; +select id from persons as p; +select id from [persons] [table]; +select id from persons [table]; +select id from [persons] as [table]; +select id from persons as [table]; +select id from persons [table 1]; +select id from persons [1table]; +select id from persons [テーブル]; -- ERROR: There's no "persons" table in this query (alias "p" covers it) select persons.id from persons p; -- Alias "p" for table "persons" is used select p.id from persons p; +-- Alias "table" for table "persons" is used +select [table].[id] from [persons] [table]; -- Multiple aliases for the same table select persons.id from persons, persons p, persons p2; +select persons.id from persons, persons [table 1], persons [table 2]; -- ERROR: Column "id" is defined in both tables (so "id" column is ambiguous) select id from persons p, cars p; select id from persons p, cars c; @@ -471,6 +497,11 @@ select * as c from cars; -- ERROR: Column alias not allowed for table asterisk select cars.* as c from cars; +-- ERROR: alias use SQL keywords +select id select from persons; +select id as select from persons; +select id from persons table; +select id from persons as table; ---------- CATEGORY: Expressions with infix operators in columns of select statement -------------- -- Complex expressions support, operators precedence, and brackets @@ -576,6 +607,12 @@ -- ERROR: ORDER BY column number 2 out of range - should be between 1 and 1 -- (there's only one visible field) select id from cars order by 2, 1; +-- ERROR: ORDER BY column is SQL keyword +select id from [table] order by table.id; +-- ORDER BY escaped table and column names +select id from [table] order by [table].id; +select id from [table] order by [table].[id]; +select id from persons order by persons.[id]; ---------- CATEGORY: JOINs ------- -- Join persons and cars tables @@ -615,17 +652,11 @@ SELECT [c] FROM persons; -- ERROR: unexpected character after parameter in column expression SELECT [p]a/2; -SELECT [p][q]; -SELECT [p] [q]; -- ERROR: unexpected character in parameter name SELECT [[]; SELECT [\[]; -- ERROR: empty parameter name SELECT []; --- ERROR: parameter in alias name -SELECT [p] AS [q]; --- ERROR: parameter in ORDER BY argument -SELECT * FROM cars ORDER BY [x]; -- Parameters in conditions SELECT name, surname, age, model FROM persons, cars WHERE persons.id = owner AND model = [Enter model]; SELECT [Enter], name, surname, age, model FROM persons, cars WHERE persons.id = [Enter ID] AND [Enter model] = model; diff --git a/autotests/tools/IdentifierTest.cpp b/autotests/tools/IdentifierTest.cpp --- a/autotests/tools/IdentifierTest.cpp +++ b/autotests/tools/IdentifierTest.cpp @@ -82,14 +82,14 @@ QTest::addColumn("string"); QTest::addColumn("result"); // quotes not always added QTest::addColumn("resultWithForcedQuotes"); // quotes always added - QTest::newRow("empty") << "" << QString() << "\"\""; - QTest::newRow("empty") << QString() << QString() << "\"\""; - QTest::newRow("\"") << "\"" << "\"\"\"\"" << "\"\"\"\""; - QTest::newRow("\"-\"") << "\"-\"" << "\"\"\"-\"\"\"" << "\"\"\"-\"\"\""; - QTest::newRow("\t") << "\t" << "\"\t\"" << "\"\t\""; - QTest::newRow("id") << "id" << "id" << "\"id\""; - QTest::newRow("keyword") << "select" << "\"select\"" << "\"select\""; - QTest::newRow("alpha") << "a b" << "\"a b\"" << "\"a b\""; + QTest::newRow("empty") << "" << QString() << "[]"; + QTest::newRow("empty") << QString() << QString() << "[]"; + QTest::newRow("[") << "[" << "[\\[]" << "[\\[]"; + QTest::newRow("[-]") << "[-]" << "[\\[-\\]]" << "[\\[-\\]]"; + QTest::newRow("\t") << "\t" << "[\t]" << "[\t]"; + QTest::newRow("id") << "id" << "id" << "[id]"; + QTest::newRow("keyword") << "select" << "[select]" << "[select]"; + QTest::newRow("alpha") << "a b" << "[a b]" << "[a b]"; } void IdentifierTest::escapeIdentifier() diff --git a/src/KDb.cpp b/src/KDb.cpp --- a/src/KDb.cpp +++ b/src/KDb.cpp @@ -1304,23 +1304,27 @@ template inline static T escapeIdentifier(const T& string, bool addQuotes) { - const Latin1CharType quote('"'); + const Latin1CharType startQuote('['); + const Latin1CharType endQuote(']'); // create - Latin1StringType escapedQuote("\"\""); + Latin1StringType escapedStartQuote("\\["); + Latin1StringType escapedEndQuote("\\]"); T newString; newString.reserve(estimatedNewLength(string, addQuotes)); if (addQuotes) { - newString.append(quote); + newString.append(startQuote); } for (int i = 0; i < string.length(); i++) { const CharType c = string.at(i); - if (c == quote) - newString.append(escapedQuote); + if (c == startQuote) + newString.append(escapedStartQuote); + else if (c == endQuote) + newString.append(escapedEndQuote); else newString.append(c); } if (addQuotes) { - newString.append(quote); + newString.append(endQuote); } newString.squeeze(); return newString; diff --git a/src/expression/KDbExpression.h b/src/expression/KDbExpression.h --- a/src/expression/KDbExpression.h +++ b/src/expression/KDbExpression.h @@ -65,6 +65,12 @@ //! Creates a deep (not shallow) copy of the KDbExpression. KDbExpression clone() const; + /*! Recursively replace all KDbQuerySchemaParameter that can be resolved to a column name to KDbVariableExpression + @return either the same expression with all its children resolved to column names, or a KDbVariableExpression if + the expression is a KDbQuerySchemaParameter that can be resolved. + */ + KDbExpression resolveQuotedIdentifiers(KDbParseInfo *parseInfo); + /*! @return the token for this expression. Tokens are characters (e.g. '+', '-') or identifiers (e.g. SQL_NULL) of elements used by the KDbSQL parser. diff --git a/src/expression/KDbExpression.cpp b/src/expression/KDbExpression.cpp --- a/src/expression/KDbExpression.cpp +++ b/src/expression/KDbExpression.cpp @@ -302,6 +302,36 @@ return KDbExpression(d->clone()); } +KDbExpression KDbExpression::resolveQuotedIdentifiers(KDbParseInfo *parseInfo) +{ + if (!isQueryParameter()) { + foreach(ExplicitlySharedExpressionDataPointer data, d->children) { + KDbExpression child(data); + child.resolveQuotedIdentifiers(parseInfo); + } + return *this; + } + const KDbQueryParameterExpression queryParam = toQueryParameter(); + QString value = queryParam.value().toString(); + if (value == QStringLiteral("*")) { + // The start would pass the validation for KDbVariableExpression, + // but within a quoted identifier it is always a query parameter. + return *this; + } + KDbVariableExpression possibleColumn (value); + if (!possibleColumn.validate(parseInfo)) { + return *this; + } + kdbDebug() << "replace" << queryParam << "for" << possibleColumn; + if (queryParam.d->parent) { + KDbExpression parent(queryParam.d->parent); + int index = parent.indexOfChild(queryParam); + parent.removeChild(index); + parent.insertChild(index, possibleColumn); + } + return possibleColumn; +} + KDbToken KDbExpression::token() const { return d->token; diff --git a/src/expression/KDbQueryParameterExpression.cpp b/src/expression/KDbQueryParameterExpression.cpp --- a/src/expression/KDbQueryParameterExpression.cpp +++ b/src/expression/KDbQueryParameterExpression.cpp @@ -106,7 +106,7 @@ KDbQueryParameterExpression::KDbQueryParameterExpression(const QString& message) : KDbConstExpression(new KDbQueryParameterExpressionData(KDbField::Text, message), - KDb::QueryParameterExpression, KDbToken::QUERY_PARAMETER) + KDb::QueryParameterExpression, KDbToken::IDENTIFIER_OR_QUERY_PARAMETER) { } diff --git a/src/parser/KDbParser_p.cpp b/src/parser/KDbParser_p.cpp --- a/src/parser/KDbParser_p.cpp +++ b/src/parser/KDbParser_p.cpp @@ -420,6 +420,7 @@ for (int i = 0; i < colViews.argCount(); i++, columnNum++) { const KDbExpression e(colViews.arg(i)); KDbExpression columnExpr(e); + columnExpr = columnExpr.resolveQuotedIdentifiers(&parseInfo); KDbVariableExpression aliasVariable; if (e.expressionClass() == KDb::SpecialBinaryExpression && e.isBinary() && (e.token() == KDbToken::AS || e.token() == KDbToken::AS_EMPTY)) { @@ -499,11 +500,12 @@ if (options) { //----- WHERE expr. if (!options->whereExpr.isNull()) { - if (!options->whereExpr.validate(&parseInfo)) { + KDbExpression whereExpr = options->whereExpr.resolveQuotedIdentifiers(&parseInfo); + if (!whereExpr.validate(&parseInfo)) { setError(parseInfo.errorMessage(), parseInfo.errorDescription()); return nullptr; } - KDbQuerySchemaPrivate::setWhereExpressionInternal(querySchema, options->whereExpr); + KDbQuerySchemaPrivate::setWhereExpressionInternal(querySchema, whereExpr); } //----- ORDER BY if (options->orderByColumns) { diff --git a/src/parser/KDbSqlParser.y b/src/parser/KDbSqlParser.y --- a/src/parser/KDbSqlParser.y +++ b/src/parser/KDbSqlParser.y @@ -55,9 +55,9 @@ %token DATETIME_CONST %token TIME_CONST %token TABLE -%token IDENTIFIER +%token UNQUOTED_IDENTIFIER %token IDENTIFIER_DOT_ASTERISK -%token QUERY_PARAMETER +%token IDENTIFIER_OR_QUERY_PARAMETER %token VARCHAR %token WHERE %token SQL @@ -376,11 +376,12 @@ %token TIME_AM %token TIME_PM -%type IDENTIFIER +%type UNQUOTED_IDENTIFIER %type IDENTIFIER_DOT_ASTERISK -%type QUERY_PARAMETER +%type IDENTIFIER_OR_QUERY_PARAMETER %type CHARACTER_STRING_LITERAL %type DOUBLE_QUOTED_STRING +%type identifier /* %type ColExpression @@ -598,7 +599,7 @@ ; /*CreateTableStatement : -CREATE TABLE IDENTIFIER +CREATE TABLE identifier { globalParser->setStatementType(KDbParser::CreateTable); globalParser->createTable($3->toLatin1()); @@ -614,15 +615,15 @@ ; ColDef: -IDENTIFIER ColType +identifier ColType { sqlParserDebug() << "adding field " << *$1; globalField->setName(*$1); globalParser->table()->addField(globalField); globalField = nullptr; delete $1; } -| IDENTIFIER ColType ColKeys +| identifier ColType ColKeys { sqlParserDebug() << "adding field " << *$1; globalField->setName(*$1); @@ -786,16 +787,16 @@ OrderByClause: OrderByColumnId { - sqlParserDebug() << "ORDER BY IDENTIFIER"; + sqlParserDebug() << "ORDER BY identifier"; $$ = new QList; OrderByColumnInternal orderByColumn; orderByColumn.setColumnByNameOrNumber( *$1 ); $$->append( orderByColumn ); delete $1; } | OrderByColumnId OrderByOption { - sqlParserDebug() << "ORDER BY IDENTIFIER OrderByOption"; + sqlParserDebug() << "ORDER BY identifier OrderByOption"; $$ = new QList; OrderByColumnInternal orderByColumn; orderByColumn.setColumnByNameOrNumber( *$1 ); @@ -823,13 +824,13 @@ ; OrderByColumnId: -IDENTIFIER +identifier { $$ = new QVariant( *$1 ); sqlParserDebug() << "OrderByColumnId: " << *$$; delete $1; } -| IDENTIFIER '.' IDENTIFIER +| identifier '.' identifier { $$ = new QVariant( *$1 + QLatin1Char('.') + *$3 ); sqlParserDebug() << "OrderByColumnId: " << *$$; @@ -1103,29 +1104,29 @@ $$ = new KDbUnaryExpression( KDbToken::NOT, *$2 ); delete $2; } -| IDENTIFIER +| UNQUOTED_IDENTIFIER { $$ = new KDbVariableExpression( *$1 ); //! @todo simplify this later if that's 'only one field name' expression sqlParserDebug() << " + identifier: " << *$1; delete $1; } -| QUERY_PARAMETER +| IDENTIFIER_OR_QUERY_PARAMETER { $$ = new KDbQueryParameterExpression( *$1 ); sqlParserDebug() << " + query parameter:" << *$$; delete $1; } -| IDENTIFIER aExprList +| identifier aExprList { sqlParserDebug() << " + function:" << *$1 << "(" << *$2 << ")"; $$ = new KDbFunctionExpression(*$1, *$2); delete $1; delete $2; } /*! @todo shall we also support db name? */ -| IDENTIFIER '.' IDENTIFIER +| identifier '.' identifier { $$ = new KDbVariableExpression( *$1 + QLatin1Char('.') + *$3 ); sqlParserDebug() << " + identifier.identifier:" << *$1 << "." << *$3; @@ -1198,6 +1199,9 @@ aExpr10 ; +identifier: UNQUOTED_IDENTIFIER | IDENTIFIER_OR_QUERY_PARAMETER +; + DateConst: '#' DateValue '#' { @@ -1351,30 +1355,30 @@ $$ = $2; } /* -| Tables LEFT JOIN IDENTIFIER SQL_ON ColExpression +| Tables LEFT JOIN identifier SQL_ON ColExpression { sqlParserDebug() << "LEFT JOIN: '" << *$4 << "' ON " << $6; addTable($4->toQString()); delete $4; } -| Tables LEFT OUTER JOIN IDENTIFIER SQL_ON ColExpression +| Tables LEFT OUTER JOIN identifier SQL_ON ColExpression { sqlParserDebug() << "LEFT OUTER JOIN: '" << $5 << "' ON " << $7; addTable($5); } -| Tables INNER JOIN IDENTIFIER SQL_ON ColExpression +| Tables INNER JOIN identifier SQL_ON ColExpression { sqlParserDebug() << "INNER JOIN: '" << *$4 << "' ON " << $6; addTable($4->toQString()); delete $4; } -| Tables RIGHT JOIN IDENTIFIER SQL_ON ColExpression +| Tables RIGHT JOIN identifier SQL_ON ColExpression { sqlParserDebug() << "RIGHT JOIN: '" << *$4 << "' ON " << $6; addTable(*$4); delete $4; } -| Tables RIGHT OUTER JOIN IDENTIFIER SQL_ON ColExpression +| Tables RIGHT OUTER JOIN identifier SQL_ON ColExpression { sqlParserDebug() << "RIGHT OUTER JOIN: '" << *$5 << "' ON " << $7; addTable($5->toQString()); @@ -1399,14 +1403,14 @@ } |FlatTable { - $$ = new KDbNArgExpression(KDb::TableListExpression, KDbToken::IDENTIFIER); //ok? + $$ = new KDbNArgExpression(KDb::TableListExpression, KDbToken::UNQUOTED_IDENTIFIER); //ok? $$->append(*$1); delete $1; } ; FlatTable: -IDENTIFIER +identifier { sqlParserDebug() << "FROM: '" << *$1 << "'"; $$ = new KDbVariableExpression(*$1); @@ -1434,7 +1438,7 @@ }*/ delete $1; } -| IDENTIFIER IDENTIFIER +| identifier identifier { //table + alias $$ = new KDbBinaryExpression( @@ -1444,7 +1448,7 @@ delete $1; delete $2; } -| IDENTIFIER AS IDENTIFIER +| identifier AS identifier { //table + alias $$ = new KDbBinaryExpression( @@ -1490,7 +1494,7 @@ $$ = $1; sqlParserDebug() << " added column wildcard:" << *$1; } -| ColExpression AS IDENTIFIER +| ColExpression AS identifier { $$ = new KDbBinaryExpression( *$1, KDbToken::AS, @@ -1500,7 +1504,7 @@ delete $1; delete $3; } -| ColExpression IDENTIFIER +| ColExpression identifier { $$ = new KDbBinaryExpression( *$1, KDbToken::AS_EMPTY, @@ -1517,8 +1521,8 @@ { $$ = $1; } -/* HANDLED BY 'IDENTIFIER aExprList' -| IDENTIFIER '(' ColViews ')' +/* HANDLED BY 'identifier aExprList' +| identifier '(' ColViews ')' { $$ = new KDbFunctionExpression( $1, $3 ); }*/ @@ -1577,7 +1581,7 @@ // globalParser->query()->addAsterisk(ast); // requiresTable = true; } -| IDENTIFIER '.' '*' +| identifier '.' '*' { QString s( *$1 ); s += QLatin1String(".*"); diff --git a/src/parser/KDbSqlScanner.l b/src/parser/KDbSqlScanner.l --- a/src/parser/KDbSqlScanner.l +++ b/src/parser/KDbSqlScanner.l @@ -52,9 +52,9 @@ e_str2 (\\\"|\"\"|[^"]) string (\'{e_str1}*\'|\"{e_str2}*\") /*identifier [a-zA-Z_][a-zA-Z_0-9]* */ -identifier [a-zA-Z_0-9]+ +unquoted_identifier [a-zA-Z_0-9]+ /* quoted_identifier (\"[a-zA-Z_0-9]+\") */ -query_parameter \[[^\[\]]+\] +identifier_or_query_parameter \[[^\[\]]+\] integer {digit}+ decimal (({digit}*\.{digit}+)|({digit}+\.{digit}*)) @@ -347,23 +347,23 @@ /* "ZZZ" sentinel for script */ } -{identifier} { +{unquoted_identifier} { sqlParserDebug() << "{identifier} yytext: '" << yytext << "' (" << yyleng << ")"; ECOUNT; if (yytext[0]>='0' && yytext[0]<='9') { setError(KDbParser::tr("Invalid identifier"), KDbParser::tr("Identifiers should start with a letter or '_' character")); return SCAN_ERROR; } yylval.stringValue = new QString(QString::fromUtf8(yytext, yyleng)); - return IDENTIFIER; + return UNQUOTED_IDENTIFIER; } -{query_parameter} { - sqlParserDebug() << "{query_parameter} yytext: '" << yytext << "' (" << yyleng << ")"; +{identifier_or_query_parameter} { + sqlParserDebug() << "{identifier_or_query_parameter} yytext: '" << yytext << "' (" << yyleng << ")"; ECOUNT; yylval.stringValue = new QString(QString::fromUtf8(yytext+1, yyleng-2)); - return QUERY_PARAMETER; + return IDENTIFIER_OR_QUERY_PARAMETER; } {whitespace}+ { diff --git a/src/parser/generated/KDbToken.h b/src/parser/generated/KDbToken.h --- a/src/parser/generated/KDbToken.h +++ b/src/parser/generated/KDbToken.h @@ -45,7 +45,7 @@ //! Creates a single-character token //! Only characters that belong to the grammar are accepted: - //! ';' ',' '.' '>' '<' '=' '+' '-' '&' '|' '/' '*' '%' '~' '#' ':' '(' ')' + //! ';' ',' '.' '>' '<' '=' '+' '-' '&' '|' '/' '*' '%' '~' '#' ':' '(' ')' //! Invalid KDbToken is created for character that is not accepted. KDbToken(char charToken); @@ -135,9 +135,9 @@ static const KDbToken DATETIME_CONST; static const KDbToken TIME_CONST; static const KDbToken TABLE; - static const KDbToken IDENTIFIER; + static const KDbToken UNQUOTED_IDENTIFIER; static const KDbToken IDENTIFIER_DOT_ASTERISK; - static const KDbToken QUERY_PARAMETER; + static const KDbToken IDENTIFIER_OR_QUERY_PARAMETER; static const KDbToken VARCHAR; static const KDbToken WHERE; static const KDbToken SQL; diff --git a/src/parser/generated/KDbToken.cpp b/src/parser/generated/KDbToken.cpp --- a/src/parser/generated/KDbToken.cpp +++ b/src/parser/generated/KDbToken.cpp @@ -160,9 +160,9 @@ const KDbToken KDbToken::DATETIME_CONST(::DATETIME_CONST); const KDbToken KDbToken::TIME_CONST(::TIME_CONST); const KDbToken KDbToken::TABLE(::TABLE); -const KDbToken KDbToken::IDENTIFIER(::IDENTIFIER); +const KDbToken KDbToken::UNQUOTED_IDENTIFIER(::UNQUOTED_IDENTIFIER); const KDbToken KDbToken::IDENTIFIER_DOT_ASTERISK(::IDENTIFIER_DOT_ASTERISK); -const KDbToken KDbToken::QUERY_PARAMETER(::QUERY_PARAMETER); +const KDbToken KDbToken::IDENTIFIER_OR_QUERY_PARAMETER(::IDENTIFIER_OR_QUERY_PARAMETER); const KDbToken KDbToken::VARCHAR(::VARCHAR); const KDbToken KDbToken::WHERE(::WHERE); const KDbToken KDbToken::SQL(::SQL); diff --git a/src/parser/generated/sqlparser.h b/src/parser/generated/sqlparser.h --- a/src/parser/generated/sqlparser.h +++ b/src/parser/generated/sqlparser.h @@ -96,9 +96,9 @@ DATETIME_CONST = 291, TIME_CONST = 292, TABLE = 293, - IDENTIFIER = 294, + UNQUOTED_IDENTIFIER = 294, IDENTIFIER_DOT_ASTERISK = 295, - QUERY_PARAMETER = 296, + IDENTIFIER_OR_QUERY_PARAMETER = 296, VARCHAR = 297, WHERE = 298, SQL = 299, @@ -135,7 +135,7 @@ union YYSTYPE { -#line 505 "KDbSqlParser.y" /* yacc.c:1909 */ +#line 506 "KDbSqlParser.y" /* yacc.c:1909 */ QString* stringValue; QByteArray* binaryValue; diff --git a/src/parser/generated/sqlparser.cpp b/src/parser/generated/sqlparser.cpp --- a/src/parser/generated/sqlparser.cpp +++ b/src/parser/generated/sqlparser.cpp @@ -62,7 +62,7 @@ /* Copy the first part of user declarations. */ -#line 435 "KDbSqlParser.y" /* yacc.c:339 */ +#line 436 "KDbSqlParser.y" /* yacc.c:339 */ #include #include @@ -203,9 +203,9 @@ DATETIME_CONST = 291, TIME_CONST = 292, TABLE = 293, - IDENTIFIER = 294, + UNQUOTED_IDENTIFIER = 294, IDENTIFIER_DOT_ASTERISK = 295, - QUERY_PARAMETER = 296, + IDENTIFIER_OR_QUERY_PARAMETER = 296, VARCHAR = 297, WHERE = 298, SQL = 299, @@ -242,7 +242,7 @@ union YYSTYPE { -#line 505 "KDbSqlParser.y" /* yacc.c:355 */ +#line 506 "KDbSqlParser.y" /* yacc.c:355 */ QString* stringValue; QByteArray* binaryValue; @@ -523,16 +523,16 @@ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 7 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 231 +#define YYLAST 293 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 88 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 38 +#define YYNNTS 39 /* YYNRULES -- Number of rules. */ -#define YYNRULES 119 +#define YYNRULES 121 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 201 +#define YYNSTATES 204 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned by yylex, with out-of-bounds checking. */ @@ -585,18 +585,19 @@ /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 564, 564, 574, 578, 579, 594, 693, 699, 706, - 711, 717, 723, 729, 738, 746, 753, 759, 767, 778, - 787, 796, 806, 814, 826, 832, 839, 846, 850, 857, - 862, 869, 875, 882, 887, 893, 899, 905, 911, 918, - 923, 929, 935, 941, 947, 953, 959, 965, 975, 986, - 991, 996, 1002, 1007, 1013, 1020, 1025, 1031, 1037, 1043, - 1049, 1056, 1061, 1067, 1073, 1080, 1086, 1091, 1096, 1101, - 1106, 1114, 1120, 1128, 1135, 1142, 1146, 1150, 1156, 1173, - 1179, 1185, 1191, 1198, 1202, 1210, 1218, 1229, 1235, 1241, - 1250, 1258, 1266, 1278, 1282, 1289, 1293, 1297, 1304, 1314, - 1323, 1327, 1334, 1340, 1349, 1394, 1400, 1409, 1437, 1447, - 1462, 1469, 1479, 1488, 1493, 1503, 1516, 1562, 1571, 1580 + 0, 565, 565, 575, 579, 580, 595, 694, 700, 707, + 712, 718, 724, 730, 739, 747, 754, 760, 768, 779, + 788, 797, 807, 815, 827, 833, 840, 847, 851, 858, + 863, 870, 876, 883, 888, 894, 900, 906, 912, 919, + 924, 930, 936, 942, 948, 954, 960, 966, 976, 987, + 992, 997, 1003, 1008, 1014, 1021, 1026, 1032, 1038, 1044, + 1050, 1057, 1062, 1068, 1074, 1081, 1087, 1092, 1097, 1102, + 1107, 1115, 1121, 1129, 1136, 1143, 1147, 1151, 1157, 1174, + 1180, 1186, 1192, 1199, 1202, 1202, 1206, 1214, 1222, 1233, + 1239, 1245, 1254, 1262, 1270, 1282, 1286, 1293, 1297, 1301, + 1308, 1318, 1327, 1331, 1338, 1344, 1353, 1398, 1404, 1413, + 1441, 1451, 1466, 1473, 1483, 1492, 1497, 1507, 1520, 1566, + 1575, 1584 }; #endif @@ -612,22 +613,22 @@ "LESS_OR_EQUAL", "GREATER_OR_EQUAL", "SQL_NULL", "SQL_IS", "SQL_IS_NULL", "SQL_IS_NOT_NULL", "ORDER", "PRIMARY", "SELECT", "INTEGER_CONST", "REAL_CONST", "RIGHT", "SQL_ON", "DATE_CONST", "DATETIME_CONST", - "TIME_CONST", "TABLE", "IDENTIFIER", "IDENTIFIER_DOT_ASTERISK", - "QUERY_PARAMETER", "VARCHAR", "WHERE", "SQL", "SQL_TRUE", "SQL_FALSE", - "UNION", "SCAN_ERROR", "AND", "BETWEEN", "NOT_BETWEEN", "EXCEPT", - "SQL_IN", "INTERSECT", "LIKE", "ILIKE", "NOT_LIKE", "NOT", "NOT_EQUAL", - "NOT_EQUAL2", "OR", "SIMILAR_TO", "NOT_SIMILAR_TO", "XOR", "UMINUS", - "TABS_OR_SPACES", "DATE_TIME_INTEGER", "TIME_AM", "TIME_PM", "';'", - "','", "'.'", "'>'", "'<'", "'='", "'+'", "'-'", "'&'", "'|'", "'/'", - "'*'", "'%'", "'~'", "'#'", "':'", "'('", "')'", "$accept", + "TIME_CONST", "TABLE", "UNQUOTED_IDENTIFIER", "IDENTIFIER_DOT_ASTERISK", + "IDENTIFIER_OR_QUERY_PARAMETER", "VARCHAR", "WHERE", "SQL", "SQL_TRUE", + "SQL_FALSE", "UNION", "SCAN_ERROR", "AND", "BETWEEN", "NOT_BETWEEN", + "EXCEPT", "SQL_IN", "INTERSECT", "LIKE", "ILIKE", "NOT_LIKE", "NOT", + "NOT_EQUAL", "NOT_EQUAL2", "OR", "SIMILAR_TO", "NOT_SIMILAR_TO", "XOR", + "UMINUS", "TABS_OR_SPACES", "DATE_TIME_INTEGER", "TIME_AM", "TIME_PM", + "';'", "','", "'.'", "'>'", "'<'", "'='", "'+'", "'-'", "'&'", "'|'", + "'/'", "'*'", "'%'", "'~'", "'#'", "':'", "'('", "')'", "$accept", "TopLevelStatement", "StatementList", "Statement", "SelectStatement", "Select", "SelectOptions", "WhereClause", "OrderByClause", "OrderByColumnId", "OrderByOption", "aExpr", "aExpr2", "aExpr3", - "aExpr4", "aExpr5", "aExpr6", "aExpr7", "aExpr8", "aExpr9", "DateConst", - "DateValue", "YearConst", "TimeConst", "TimeValue", "TimeMs", - "TimePeriod", "DateTimeConst", "aExpr10", "aExprList", "aExprList2", - "Tables", "FlatTableList", "FlatTable", "ColViews", "ColItem", - "ColExpression", "ColWildCard", YY_NULLPTR + "aExpr4", "aExpr5", "aExpr6", "aExpr7", "aExpr8", "aExpr9", "identifier", + "DateConst", "DateValue", "YearConst", "TimeConst", "TimeValue", + "TimeMs", "TimePeriod", "DateTimeConst", "aExpr10", "aExprList", + "aExprList2", "Tables", "FlatTableList", "FlatTable", "ColViews", + "ColItem", "ColExpression", "ColWildCard", YY_NULLPTR }; #endif @@ -648,41 +649,41 @@ }; # endif -#define YYPACT_NINF -143 +#define YYPACT_NINF -148 #define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-143))) + (!!((Yystate) == (-148))) -#define YYTABLE_NINF -1 +#define YYTABLE_NINF -86 #define yytable_value_is_error(Yytable_value) \ 0 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ static const yytype_int16 yypact[] = { - 1, -143, 52, -143, -8, -143, 22, -143, 1, -143, - -27, 25, -143, -143, -143, -60, -143, -143, -143, 126, - 126, 126, -143, 126, 44, 126, -143, -143, -16, 13, - 163, -143, 86, 0, 64, -143, -143, -143, -143, -11, - 29, -143, 10, -143, -143, 102, 11, -5, -143, -23, - -2, -143, -21, -143, -143, -143, -143, -61, 4, 26, - -43, 24, 20, 35, 126, 126, 126, 126, 126, 126, - 126, 126, -143, -143, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 96, 126, -143, 84, 78, -143, -11, - 74, -143, 38, 98, -143, 25, -143, -143, -143, 71, - 48, 110, 89, 99, -143, -143, 101, -143, 103, -143, - -143, -143, -143, -143, -143, -143, -143, -143, -143, 114, - 120, -143, -143, -143, -143, -143, -143, -143, -143, -143, - -143, -143, -143, -143, -143, -143, -143, -143, 58, -143, - 172, -143, -143, -143, -143, -143, -143, 126, -143, 111, - -12, 112, 115, 121, 126, 126, -143, 128, 144, 12, - 58, -143, 63, 134, 137, -48, -143, 138, -143, -143, - 167, -143, -143, -143, 58, 136, -143, -143, -143, -143, - 139, -143, -143, -143, -143, -143, -143, 58, -48, -143, - -143 + -27, -148, 29, -148, -34, -148, 33, -148, -27, -148, + -30, 84, -148, -148, -148, -42, -40, -148, -148, 193, + 193, 193, -148, 193, 55, 193, -148, -148, -26, 2, + 230, -148, 153, 4, 26, -25, -148, -148, -148, -148, + -1, -12, -148, 30, -148, -148, 145, -148, -148, 49, + -9, -148, -148, 32, -148, -148, -148, 53, 22, 45, + -62, 38, 42, 52, 193, 193, 193, 193, 193, 193, + 193, 193, -148, -148, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, -21, 9, -148, 118, 193, -148, 125, + 89, -148, -1, 84, -148, 59, 84, -148, 84, 84, + 97, 101, -148, -148, 107, -148, 114, -148, -148, -148, + -148, -148, -148, -148, -148, -148, -148, 122, 134, -148, + -148, -148, -148, -148, -148, -148, -148, -148, -148, -148, + -148, -148, -148, -148, -148, -148, -148, -148, -148, 128, + 98, 27, -148, 178, -148, -148, -148, -148, -148, -148, + 112, 39, 115, 117, 127, 193, 193, 193, -148, -148, + 159, 13, 135, 27, 60, 139, 141, 110, -148, 142, + -148, -148, -148, -148, -148, -148, 27, 140, 84, -148, + -148, -148, -148, 138, -148, -148, -148, -148, -148, 27, + -148, 110, -148, -148 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -692,102 +693,114 @@ { 0, 14, 0, 2, 4, 6, 7, 1, 5, 77, 0, 0, 74, 78, 79, 70, 71, 75, 76, 0, - 0, 0, 118, 0, 0, 0, 116, 29, 33, 39, - 49, 52, 55, 61, 65, 80, 81, 82, 83, 10, - 8, 111, 112, 113, 3, 0, 107, 104, 106, 0, - 0, 72, 70, 69, 67, 66, 68, 87, 0, 0, + 0, 0, 120, 0, 0, 0, 118, 29, 33, 39, + 49, 52, 55, 61, 65, 0, 80, 81, 82, 83, + 10, 8, 113, 114, 115, 3, 0, 84, 85, 109, + 106, 108, 69, 0, 67, 66, 68, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 15, 0, 11, 9, - 0, 115, 0, 0, 108, 0, 73, 119, 101, 103, - 0, 0, 0, 0, 88, 89, 0, 84, 0, 90, - 99, 30, 31, 32, 37, 35, 34, 36, 38, 0, - 0, 44, 42, 43, 40, 41, 45, 46, 53, 54, - 57, 56, 58, 59, 60, 62, 63, 64, 0, 19, - 0, 110, 13, 114, 117, 109, 105, 0, 100, 0, - 94, 0, 0, 0, 0, 0, 26, 24, 16, 20, - 0, 102, 0, 0, 0, 97, 98, 0, 47, 48, - 0, 18, 27, 28, 0, 21, 17, 87, 86, 93, - 94, 95, 96, 91, 85, 25, 22, 0, 97, 23, - 92 + 0, 0, 0, 0, 0, 72, 0, 0, 12, 15, + 0, 11, 9, 0, 117, 0, 0, 110, 0, 0, + 0, 0, 90, 91, 0, 86, 0, 92, 101, 30, + 31, 32, 37, 35, 34, 36, 38, 0, 0, 44, + 42, 43, 40, 41, 45, 46, 53, 54, 57, 56, + 58, 59, 60, 62, 63, 64, 121, 73, 103, 105, + 0, 0, 19, 0, 112, 13, 116, 119, 111, 107, + 0, 96, 0, 0, 0, 0, 0, 0, 102, 26, + 16, 20, 24, 0, 0, 0, 0, 99, 100, 0, + 47, 48, 104, 18, 27, 28, 0, 21, 0, 17, + 89, 88, 95, 96, 97, 98, 93, 87, 22, 0, + 25, 99, 23, 94 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -143, -143, 200, -143, -143, -143, -29, 47, -142, -143, - -143, -25, 87, 106, -73, -143, 32, 107, 90, 108, - -143, -143, 45, -143, 105, 34, 21, -143, -143, -143, - 70, 188, -143, 124, -143, 133, 186, -143 + -148, -148, 204, -148, -148, -148, -39, 43, -147, -148, + -148, -24, 90, 81, -67, -148, 104, 109, 68, 121, + -6, -148, -148, 40, -148, 102, 25, 14, -148, -148, + -148, 56, 179, -148, 111, -148, 126, 181, -148 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 2, 3, 4, 5, 6, 95, 96, 168, 169, - 185, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 60, 61, 36, 62, 175, 193, 37, 38, 51, - 110, 39, 47, 48, 40, 41, 42, 43 + -1, 2, 3, 4, 5, 6, 98, 99, 170, 171, + 187, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 53, 36, 60, 61, 37, 62, 177, 196, 38, 39, + 95, 150, 40, 50, 51, 41, 42, 43, 44 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule whose number is the opposite. If YYTABLE_NINF, syntax error. */ -static const yytype_uint8 yytable[] = +static const yytype_int16 yytable[] = { - 63, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 9, 98, 49, 85, 100, 103, 106, 93, 182, 112, - 191, 192, 12, 116, 113, 109, 50, 183, 186, 13, - 14, 1, 94, 64, 9, 67, 68, 52, 10, 16, - 11, 117, 196, 17, 18, 65, 12, 11, 66, 101, - 104, 111, 7, 13, 14, 199, 19, 93, 107, 45, - 173, 15, 8, 16, 46, 50, 105, 17, 18, 149, - 152, 114, 94, 174, 20, 21, 86, 87, 88, 89, - 19, 23, 24, 184, 25, 108, 69, 70, 71, 166, - 9, 178, 179, 115, 10, 83, 84, 167, 20, 21, - 97, 118, 12, 22, 119, 23, 24, 148, 25, 13, - 14, 57, 150, 153, 9, 138, 139, 15, 10, 16, - 58, 59, 120, 17, 18, 154, 12, 53, 54, 55, - 187, 56, 109, 13, 14, 158, 19, 155, 9, 58, - 59, 52, 157, 16, 90, 91, 92, 17, 18, 106, - 12, 121, 122, 123, 20, 21, 159, 13, 14, 22, - 19, 23, 24, 164, 25, 52, 160, 16, 161, 165, - 163, 17, 18, 124, 125, 126, 127, 128, 20, 21, - 145, 146, 147, 170, 19, 23, 24, 94, 25, 72, - 73, 172, 140, 141, 142, 143, 144, 113, 177, 176, - 180, 189, 20, 21, 190, 194, 195, 197, 44, 23, - 24, 173, 25, 74, 75, 181, 76, 188, 77, 200, - 78, 162, 79, 80, 198, 81, 82, 171, 99, 156, - 151, 102 + 35, 63, 101, 1, 114, 49, 11, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 96, 85, 47, 184, + 48, 9, 115, 64, 67, 68, 189, 96, 185, 7, + -84, 97, -85, 12, 103, 65, 8, 104, 66, 198, + 13, 14, 97, 107, -84, 9, -85, 93, 15, 10, + 16, 11, 202, 106, 17, 18, 46, 12, 169, 100, + 146, 94, 108, 155, 13, 14, 47, 19, 48, 47, + 149, 48, 15, 152, 16, 69, 70, 71, 17, 18, + 86, 87, 88, 89, 186, 20, 21, 147, 47, 112, + 48, 19, 23, 24, 35, 25, 148, 156, 180, 181, + 158, 9, 49, 147, 109, 10, 90, 91, 92, 20, + 21, 175, 113, 12, 22, 116, 23, 24, 94, 25, + 13, 14, 57, 47, 176, 48, 117, 190, 15, 151, + 16, 58, 59, 110, 17, 18, 58, 59, 111, 118, + 52, 54, 55, 149, 56, 172, 157, 19, 122, 123, + 124, 125, 126, 153, 119, 120, 121, 9, 143, 144, + 145, 10, 83, 84, 160, 20, 21, 172, 161, 12, + 22, 165, 23, 24, 162, 25, 13, 14, 194, 195, + 172, 164, 200, 166, 15, 168, 16, 136, 137, 173, + 17, 18, 174, 172, 138, 139, 140, 141, 142, 167, + 111, 178, 97, 19, 179, 9, 192, 188, 193, 197, + 175, 199, 45, 183, 191, 203, 163, 12, 201, 159, + 102, 20, 21, 182, 13, 14, 154, 105, 23, 24, + 0, 25, 15, 0, 16, 0, 0, 0, 17, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 0, 72, 73, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 21, 0, 0, 0, 0, 0, 23, 24, 0, 25, + 74, 75, 0, 76, 0, 77, 0, 78, 0, 79, + 80, 0, 81, 82 }; -static const yytype_uint8 yycheck[] = +static const yytype_int16 yycheck[] = { - 25, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 12, 40, 72, 13, 4, 4, 39, 28, 6, 80, - 68, 69, 24, 66, 85, 50, 86, 15, 170, 31, - 32, 30, 43, 49, 12, 22, 23, 39, 16, 41, - 18, 84, 184, 45, 46, 61, 24, 18, 64, 39, - 39, 72, 0, 31, 32, 197, 58, 28, 81, 86, - 72, 39, 70, 41, 39, 86, 71, 45, 46, 94, - 99, 67, 43, 85, 76, 77, 76, 77, 78, 79, - 58, 83, 84, 71, 86, 87, 73, 74, 75, 31, - 12, 164, 165, 67, 16, 9, 10, 39, 76, 77, - 71, 77, 24, 81, 84, 83, 84, 11, 86, 31, - 32, 67, 28, 39, 12, 83, 84, 39, 16, 41, - 76, 77, 87, 45, 46, 87, 24, 19, 20, 21, - 67, 23, 157, 31, 32, 87, 58, 39, 12, 76, - 77, 39, 71, 41, 80, 81, 82, 45, 46, 39, - 24, 64, 65, 66, 76, 77, 67, 31, 32, 81, - 58, 83, 84, 49, 86, 39, 67, 41, 67, 49, - 67, 45, 46, 67, 68, 69, 70, 71, 76, 77, - 90, 91, 92, 11, 58, 83, 84, 43, 86, 26, - 27, 80, 85, 86, 87, 88, 89, 85, 77, 84, - 72, 67, 76, 77, 67, 67, 39, 71, 8, 83, - 84, 72, 86, 50, 51, 168, 53, 172, 55, 198, - 57, 116, 59, 60, 190, 62, 63, 157, 40, 105, - 97, 45 + 6, 25, 41, 30, 66, 11, 18, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 28, 13, 39, 6, + 41, 12, 84, 49, 22, 23, 173, 28, 15, 0, + 72, 43, 72, 24, 4, 61, 70, 43, 64, 186, + 31, 32, 43, 49, 86, 12, 86, 72, 39, 16, + 41, 18, 199, 4, 45, 46, 86, 24, 31, 71, + 81, 86, 71, 102, 31, 32, 39, 58, 41, 39, + 94, 41, 39, 97, 41, 73, 74, 75, 45, 46, + 76, 77, 78, 79, 71, 76, 77, 93, 39, 67, + 41, 58, 83, 84, 100, 86, 87, 103, 165, 166, + 106, 12, 108, 109, 72, 16, 80, 81, 82, 76, + 77, 72, 67, 24, 81, 77, 83, 84, 86, 86, + 31, 32, 67, 39, 85, 41, 84, 67, 39, 11, + 41, 76, 77, 80, 45, 46, 76, 77, 85, 87, + 19, 20, 21, 167, 23, 151, 87, 58, 67, 68, + 69, 70, 71, 28, 64, 65, 66, 12, 90, 91, + 92, 16, 9, 10, 67, 76, 77, 173, 67, 24, + 81, 49, 83, 84, 67, 86, 31, 32, 68, 69, + 186, 67, 188, 49, 39, 87, 41, 83, 84, 11, + 45, 46, 80, 199, 85, 86, 87, 88, 89, 71, + 85, 84, 43, 58, 77, 12, 67, 72, 67, 67, + 72, 71, 8, 170, 174, 201, 114, 24, 193, 108, + 41, 76, 77, 167, 31, 32, 100, 46, 83, 84, + -1, 86, 39, -1, 41, -1, -1, -1, 45, 46, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 58, -1, -1, -1, -1, 26, 27, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 76, + 77, -1, -1, -1, -1, -1, 83, 84, -1, 86, + 50, 51, -1, 53, -1, 55, -1, 57, -1, 59, + 60, -1, 62, 63 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -797,24 +810,24 @@ 0, 30, 89, 90, 91, 92, 93, 0, 70, 12, 16, 18, 24, 31, 32, 39, 41, 45, 46, 58, 76, 77, 81, 83, 84, 86, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 111, 115, 116, 119, - 122, 123, 124, 125, 90, 86, 39, 120, 121, 72, - 86, 117, 39, 107, 107, 107, 107, 67, 76, 77, - 109, 110, 112, 99, 49, 61, 64, 22, 23, 73, + 103, 104, 105, 106, 107, 108, 109, 112, 116, 117, + 120, 123, 124, 125, 126, 90, 86, 39, 41, 108, + 121, 122, 107, 108, 107, 107, 107, 67, 76, 77, + 110, 111, 113, 99, 49, 61, 64, 22, 23, 73, 74, 75, 26, 27, 50, 51, 53, 55, 57, 59, 60, 62, 63, 9, 10, 13, 76, 77, 78, 79, - 80, 81, 82, 28, 43, 94, 95, 71, 94, 119, - 4, 39, 124, 4, 39, 71, 39, 81, 87, 99, - 118, 72, 80, 85, 67, 67, 66, 84, 77, 84, - 87, 100, 100, 100, 101, 101, 101, 101, 101, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 104, 104, - 105, 105, 105, 105, 105, 106, 106, 106, 11, 99, - 28, 123, 94, 39, 87, 39, 121, 71, 87, 67, - 67, 67, 112, 67, 49, 49, 31, 39, 96, 97, - 11, 118, 80, 72, 85, 113, 84, 77, 102, 102, - 72, 95, 6, 15, 71, 98, 96, 67, 110, 67, - 67, 68, 69, 114, 67, 39, 96, 71, 113, 96, - 114 + 80, 81, 82, 72, 86, 118, 28, 43, 94, 95, + 71, 94, 120, 4, 108, 125, 4, 108, 71, 72, + 80, 85, 67, 67, 66, 84, 77, 84, 87, 100, + 100, 100, 101, 101, 101, 101, 101, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 104, 104, 105, 105, + 105, 105, 105, 106, 106, 106, 81, 108, 87, 99, + 119, 11, 99, 28, 124, 94, 108, 87, 108, 122, + 67, 67, 67, 113, 67, 49, 49, 71, 87, 31, + 96, 97, 108, 11, 80, 72, 85, 114, 84, 77, + 102, 102, 119, 95, 6, 15, 71, 98, 72, 96, + 67, 111, 67, 67, 68, 69, 115, 67, 96, 71, + 108, 114, 96, 115 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ @@ -828,10 +841,11 @@ 103, 103, 103, 104, 104, 104, 105, 105, 105, 105, 105, 105, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 108, 109, 109, 110, 110, 110, - 111, 112, 112, 113, 113, 114, 114, 114, 115, 116, - 117, 117, 118, 118, 119, 120, 120, 121, 121, 121, - 122, 122, 123, 123, 123, 123, 124, 124, 125, 125 + 107, 107, 107, 107, 108, 108, 109, 110, 110, 111, + 111, 111, 112, 113, 113, 114, 114, 115, 115, 115, + 116, 117, 118, 118, 119, 119, 120, 121, 121, 122, + 122, 122, 123, 123, 124, 124, 124, 124, 125, 125, + 126, 126 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ @@ -845,10 +859,11 @@ 2, 2, 1, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 3, 1, 2, 2, 2, 2, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 5, 5, 1, 2, 2, - 3, 5, 7, 2, 0, 1, 1, 0, 5, 3, - 3, 2, 3, 1, 2, 3, 1, 1, 2, 3, - 3, 1, 1, 1, 3, 2, 1, 4, 1, 3 + 1, 1, 1, 1, 1, 1, 3, 5, 5, 1, + 2, 2, 3, 5, 7, 2, 0, 1, 1, 0, + 5, 3, 3, 2, 3, 1, 2, 3, 1, 1, + 2, 3, 3, 1, 1, 1, 3, 2, 1, 4, + 1, 3 }; @@ -1525,423 +1540,423 @@ switch (yyn) { case 2: -#line 565 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 566 "KDbSqlParser.y" /* yacc.c:1646 */ { //todo: multiple statements //todo: not only "select" statements KDbParserPrivate::get(globalParser)->setStatementType(KDbParser::Select); KDbParserPrivate::get(globalParser)->setQuerySchema((yyvsp[0].querySchema)); } -#line 1536 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1551 "sqlparser.cpp" /* yacc.c:1646 */ break; case 3: -#line 575 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 576 "KDbSqlParser.y" /* yacc.c:1646 */ { //todo: multiple statements } -#line 1544 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1559 "sqlparser.cpp" /* yacc.c:1646 */ break; case 5: -#line 580 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 581 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.querySchema) = (yyvsp[-1].querySchema); } -#line 1552 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1567 "sqlparser.cpp" /* yacc.c:1646 */ break; case 6: -#line 595 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 596 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.querySchema) = (yyvsp[0].querySchema); } -#line 1560 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1575 "sqlparser.cpp" /* yacc.c:1646 */ break; case 7: -#line 694 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 695 "KDbSqlParser.y" /* yacc.c:1646 */ { sqlParserDebug() << "Select"; if (!((yyval.querySchema) = buildSelectQuery( (yyvsp[0].querySchema), nullptr ))) YYABORT; } -#line 1570 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1585 "sqlparser.cpp" /* yacc.c:1646 */ break; case 8: -#line 700 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 701 "KDbSqlParser.y" /* yacc.c:1646 */ { sqlParserDebug() << "Select ColViews=" << *(yyvsp[0].exprList); if (!((yyval.querySchema) = buildSelectQuery( (yyvsp[-1].querySchema), (yyvsp[0].exprList) ))) YYABORT; } -#line 1581 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1596 "sqlparser.cpp" /* yacc.c:1646 */ break; case 9: -#line 707 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 708 "KDbSqlParser.y" /* yacc.c:1646 */ { if (!((yyval.querySchema) = buildSelectQuery( (yyvsp[-2].querySchema), (yyvsp[-1].exprList), (yyvsp[0].exprList) ))) YYABORT; } -#line 1590 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1605 "sqlparser.cpp" /* yacc.c:1646 */ break; case 10: -#line 712 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 713 "KDbSqlParser.y" /* yacc.c:1646 */ { sqlParserDebug() << "Select ColViews Tables"; if (!((yyval.querySchema) = buildSelectQuery( (yyvsp[-1].querySchema), nullptr, (yyvsp[0].exprList) ))) YYABORT; } -#line 1600 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1615 "sqlparser.cpp" /* yacc.c:1646 */ break; case 11: -#line 718 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 719 "KDbSqlParser.y" /* yacc.c:1646 */ { sqlParserDebug() << "Select ColViews Conditions"; if (!((yyval.querySchema) = buildSelectQuery( (yyvsp[-2].querySchema), (yyvsp[-1].exprList), nullptr, (yyvsp[0].selectOptions) ))) YYABORT; } -#line 1610 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1625 "sqlparser.cpp" /* yacc.c:1646 */ break; case 12: -#line 724 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 725 "KDbSqlParser.y" /* yacc.c:1646 */ { sqlParserDebug() << "Select Tables SelectOptions"; if (!((yyval.querySchema) = buildSelectQuery( (yyvsp[-2].querySchema), nullptr, (yyvsp[-1].exprList), (yyvsp[0].selectOptions) ))) YYABORT; } -#line 1620 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1635 "sqlparser.cpp" /* yacc.c:1646 */ break; case 13: -#line 730 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 731 "KDbSqlParser.y" /* yacc.c:1646 */ { sqlParserDebug() << "Select ColViews Tables SelectOptions"; if (!((yyval.querySchema) = buildSelectQuery( (yyvsp[-3].querySchema), (yyvsp[-2].exprList), (yyvsp[-1].exprList), (yyvsp[0].selectOptions) ))) YYABORT; } -#line 1630 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1645 "sqlparser.cpp" /* yacc.c:1646 */ break; case 14: -#line 739 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 740 "KDbSqlParser.y" /* yacc.c:1646 */ { sqlParserDebug() << "SELECT"; (yyval.querySchema) = KDbParserPrivate::get(globalParser)->createQuery(); } -#line 1639 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1654 "sqlparser.cpp" /* yacc.c:1646 */ break; case 15: -#line 747 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 748 "KDbSqlParser.y" /* yacc.c:1646 */ { sqlParserDebug() << "WhereClause"; (yyval.selectOptions) = new SelectOptionsInternal; (yyval.selectOptions)->whereExpr = *(yyvsp[0].expr); delete (yyvsp[0].expr); } -#line 1650 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1665 "sqlparser.cpp" /* yacc.c:1646 */ break; case 16: -#line 754 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 755 "KDbSqlParser.y" /* yacc.c:1646 */ { sqlParserDebug() << "OrderByClause"; (yyval.selectOptions) = new SelectOptionsInternal; (yyval.selectOptions)->orderByColumns = (yyvsp[0].orderByColumns); } -#line 1660 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1675 "sqlparser.cpp" /* yacc.c:1646 */ break; case 17: -#line 760 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 761 "KDbSqlParser.y" /* yacc.c:1646 */ { sqlParserDebug() << "WhereClause ORDER BY OrderByClause"; (yyval.selectOptions) = new SelectOptionsInternal; (yyval.selectOptions)->whereExpr = *(yyvsp[-3].expr); delete (yyvsp[-3].expr); (yyval.selectOptions)->orderByColumns = (yyvsp[0].orderByColumns); } -#line 1672 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1687 "sqlparser.cpp" /* yacc.c:1646 */ break; case 18: -#line 768 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 769 "KDbSqlParser.y" /* yacc.c:1646 */ { sqlParserDebug() << "OrderByClause WhereClause"; (yyval.selectOptions) = new SelectOptionsInternal; (yyval.selectOptions)->whereExpr = *(yyvsp[0].expr); delete (yyvsp[0].expr); (yyval.selectOptions)->orderByColumns = (yyvsp[-1].orderByColumns); } -#line 1684 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1699 "sqlparser.cpp" /* yacc.c:1646 */ break; case 19: -#line 779 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 780 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[0].expr); } -#line 1692 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1707 "sqlparser.cpp" /* yacc.c:1646 */ break; case 20: -#line 788 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 789 "KDbSqlParser.y" /* yacc.c:1646 */ { - sqlParserDebug() << "ORDER BY IDENTIFIER"; + sqlParserDebug() << "ORDER BY identifier"; (yyval.orderByColumns) = new QList; OrderByColumnInternal orderByColumn; orderByColumn.setColumnByNameOrNumber( *(yyvsp[0].variantValue) ); (yyval.orderByColumns)->append( orderByColumn ); delete (yyvsp[0].variantValue); } -#line 1705 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1720 "sqlparser.cpp" /* yacc.c:1646 */ break; case 21: -#line 797 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 798 "KDbSqlParser.y" /* yacc.c:1646 */ { - sqlParserDebug() << "ORDER BY IDENTIFIER OrderByOption"; + sqlParserDebug() << "ORDER BY identifier OrderByOption"; (yyval.orderByColumns) = new QList; OrderByColumnInternal orderByColumn; orderByColumn.setColumnByNameOrNumber( *(yyvsp[-1].variantValue) ); orderByColumn.order = (yyvsp[0].sortOrderValue); (yyval.orderByColumns)->append( orderByColumn ); delete (yyvsp[-1].variantValue); } -#line 1719 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1734 "sqlparser.cpp" /* yacc.c:1646 */ break; case 22: -#line 807 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 808 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.orderByColumns) = (yyvsp[0].orderByColumns); OrderByColumnInternal orderByColumn; orderByColumn.setColumnByNameOrNumber( *(yyvsp[-2].variantValue) ); (yyval.orderByColumns)->append( orderByColumn ); delete (yyvsp[-2].variantValue); } -#line 1731 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1746 "sqlparser.cpp" /* yacc.c:1646 */ break; case 23: -#line 815 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 816 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.orderByColumns) = (yyvsp[0].orderByColumns); OrderByColumnInternal orderByColumn; orderByColumn.setColumnByNameOrNumber( *(yyvsp[-3].variantValue) ); orderByColumn.order = (yyvsp[-2].sortOrderValue); (yyval.orderByColumns)->append( orderByColumn ); delete (yyvsp[-3].variantValue); } -#line 1744 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1759 "sqlparser.cpp" /* yacc.c:1646 */ break; case 24: -#line 827 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 828 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.variantValue) = new QVariant( *(yyvsp[0].stringValue) ); sqlParserDebug() << "OrderByColumnId: " << *(yyval.variantValue); delete (yyvsp[0].stringValue); } -#line 1754 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1769 "sqlparser.cpp" /* yacc.c:1646 */ break; case 25: -#line 833 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 834 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.variantValue) = new QVariant( *(yyvsp[-2].stringValue) + QLatin1Char('.') + *(yyvsp[0].stringValue) ); sqlParserDebug() << "OrderByColumnId: " << *(yyval.variantValue); delete (yyvsp[-2].stringValue); delete (yyvsp[0].stringValue); } -#line 1765 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1780 "sqlparser.cpp" /* yacc.c:1646 */ break; case 26: -#line 840 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 841 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.variantValue) = new QVariant((yyvsp[0].integerValue)); sqlParserDebug() << "OrderByColumnId: " << *(yyval.variantValue); } -#line 1774 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1789 "sqlparser.cpp" /* yacc.c:1646 */ break; case 27: -#line 847 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 848 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.sortOrderValue) = KDbOrderByColumn::SortOrder::Ascending; } -#line 1782 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1797 "sqlparser.cpp" /* yacc.c:1646 */ break; case 28: -#line 851 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 852 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.sortOrderValue) = KDbOrderByColumn::SortOrder::Descending; } -#line 1790 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1805 "sqlparser.cpp" /* yacc.c:1646 */ break; case 30: -#line 863 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 864 "KDbSqlParser.y" /* yacc.c:1646 */ { // sqlParserDebug() << "AND " << $3.debugString(); (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), KDbToken::AND, *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1801 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1816 "sqlparser.cpp" /* yacc.c:1646 */ break; case 31: -#line 870 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 871 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), KDbToken::OR, *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1811 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1826 "sqlparser.cpp" /* yacc.c:1646 */ break; case 32: -#line 876 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 877 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), KDbToken::XOR, *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1821 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1836 "sqlparser.cpp" /* yacc.c:1646 */ break; case 34: -#line 888 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 889 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), '>', *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1831 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1846 "sqlparser.cpp" /* yacc.c:1646 */ break; case 35: -#line 894 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 895 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), KDbToken::GREATER_OR_EQUAL, *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1841 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1856 "sqlparser.cpp" /* yacc.c:1646 */ break; case 36: -#line 900 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 901 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), '<', *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1851 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1866 "sqlparser.cpp" /* yacc.c:1646 */ break; case 37: -#line 906 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 907 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), KDbToken::LESS_OR_EQUAL, *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1861 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1876 "sqlparser.cpp" /* yacc.c:1646 */ break; case 38: -#line 912 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 913 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), '=', *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1871 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1886 "sqlparser.cpp" /* yacc.c:1646 */ break; case 40: -#line 924 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 925 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), KDbToken::NOT_EQUAL, *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1881 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1896 "sqlparser.cpp" /* yacc.c:1646 */ break; case 41: -#line 930 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 931 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), KDbToken::NOT_EQUAL2, *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1891 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1906 "sqlparser.cpp" /* yacc.c:1646 */ break; case 42: -#line 936 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 937 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), KDbToken::LIKE, *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1901 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1916 "sqlparser.cpp" /* yacc.c:1646 */ break; case 43: -#line 942 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 943 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), KDbToken::NOT_LIKE, *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1911 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1926 "sqlparser.cpp" /* yacc.c:1646 */ break; case 44: -#line 948 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 949 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), KDbToken::SQL_IN, *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1921 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1936 "sqlparser.cpp" /* yacc.c:1646 */ break; case 45: -#line 954 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 955 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), KDbToken::SIMILAR_TO, *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1931 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1946 "sqlparser.cpp" /* yacc.c:1646 */ break; case 46: -#line 960 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 961 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), KDbToken::NOT_SIMILAR_TO, *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1941 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1956 "sqlparser.cpp" /* yacc.c:1646 */ break; case 47: -#line 966 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 967 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbNArgExpression(KDb::RelationalExpression, KDbToken::BETWEEN_AND); (yyval.expr)->toNArg().append( *(yyvsp[-4].expr) ); @@ -1951,11 +1966,11 @@ delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1955 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1970 "sqlparser.cpp" /* yacc.c:1646 */ break; case 48: -#line 976 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 977 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbNArgExpression(KDb::RelationalExpression, KDbToken::NOT_BETWEEN_AND); (yyval.expr)->toNArg().append( *(yyvsp[-4].expr) ); @@ -1965,246 +1980,246 @@ delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1969 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1984 "sqlparser.cpp" /* yacc.c:1646 */ break; case 50: -#line 992 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 993 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbUnaryExpression( KDbToken::SQL_IS_NULL, *(yyvsp[-1].expr) ); delete (yyvsp[-1].expr); } -#line 1978 "sqlparser.cpp" /* yacc.c:1646 */ +#line 1993 "sqlparser.cpp" /* yacc.c:1646 */ break; case 51: -#line 997 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 998 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbUnaryExpression( KDbToken::SQL_IS_NOT_NULL, *(yyvsp[-1].expr) ); delete (yyvsp[-1].expr); } -#line 1987 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2002 "sqlparser.cpp" /* yacc.c:1646 */ break; case 53: -#line 1008 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1009 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), KDbToken::BITWISE_SHIFT_LEFT, *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 1997 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2012 "sqlparser.cpp" /* yacc.c:1646 */ break; case 54: -#line 1014 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1015 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), KDbToken::BITWISE_SHIFT_RIGHT, *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 2007 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2022 "sqlparser.cpp" /* yacc.c:1646 */ break; case 56: -#line 1026 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1027 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), '+', *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 2017 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2032 "sqlparser.cpp" /* yacc.c:1646 */ break; case 57: -#line 1032 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1033 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), KDbToken::CONCATENATION, *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 2027 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2042 "sqlparser.cpp" /* yacc.c:1646 */ break; case 58: -#line 1038 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1039 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), '-', *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 2037 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2052 "sqlparser.cpp" /* yacc.c:1646 */ break; case 59: -#line 1044 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1045 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), '&', *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 2047 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2062 "sqlparser.cpp" /* yacc.c:1646 */ break; case 60: -#line 1050 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1051 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), '|', *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 2057 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2072 "sqlparser.cpp" /* yacc.c:1646 */ break; case 62: -#line 1062 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1063 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), '/', *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 2067 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2082 "sqlparser.cpp" /* yacc.c:1646 */ break; case 63: -#line 1068 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1069 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), '*', *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 2077 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2092 "sqlparser.cpp" /* yacc.c:1646 */ break; case 64: -#line 1074 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1075 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression(*(yyvsp[-2].expr), '%', *(yyvsp[0].expr)); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 2087 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2102 "sqlparser.cpp" /* yacc.c:1646 */ break; case 66: -#line 1087 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1088 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbUnaryExpression( '-', *(yyvsp[0].expr) ); delete (yyvsp[0].expr); } -#line 2096 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2111 "sqlparser.cpp" /* yacc.c:1646 */ break; case 67: -#line 1092 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1093 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbUnaryExpression( '+', *(yyvsp[0].expr) ); delete (yyvsp[0].expr); } -#line 2105 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2120 "sqlparser.cpp" /* yacc.c:1646 */ break; case 68: -#line 1097 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1098 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbUnaryExpression( '~', *(yyvsp[0].expr) ); delete (yyvsp[0].expr); } -#line 2114 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2129 "sqlparser.cpp" /* yacc.c:1646 */ break; case 69: -#line 1102 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1103 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbUnaryExpression( KDbToken::NOT, *(yyvsp[0].expr) ); delete (yyvsp[0].expr); } -#line 2123 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2138 "sqlparser.cpp" /* yacc.c:1646 */ break; case 70: -#line 1107 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1108 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbVariableExpression( *(yyvsp[0].stringValue) ); //! @todo simplify this later if that's 'only one field name' expression sqlParserDebug() << " + identifier: " << *(yyvsp[0].stringValue); delete (yyvsp[0].stringValue); } -#line 2135 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2150 "sqlparser.cpp" /* yacc.c:1646 */ break; case 71: -#line 1115 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1116 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbQueryParameterExpression( *(yyvsp[0].stringValue) ); sqlParserDebug() << " + query parameter:" << *(yyval.expr); delete (yyvsp[0].stringValue); } -#line 2145 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2160 "sqlparser.cpp" /* yacc.c:1646 */ break; case 72: -#line 1121 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1122 "KDbSqlParser.y" /* yacc.c:1646 */ { sqlParserDebug() << " + function:" << *(yyvsp[-1].stringValue) << "(" << *(yyvsp[0].exprList) << ")"; (yyval.expr) = new KDbFunctionExpression(*(yyvsp[-1].stringValue), *(yyvsp[0].exprList)); delete (yyvsp[-1].stringValue); delete (yyvsp[0].exprList); } -#line 2156 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2171 "sqlparser.cpp" /* yacc.c:1646 */ break; case 73: -#line 1129 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1130 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbVariableExpression( *(yyvsp[-2].stringValue) + QLatin1Char('.') + *(yyvsp[0].stringValue) ); sqlParserDebug() << " + identifier.identifier:" << *(yyvsp[-2].stringValue) << "." << *(yyvsp[0].stringValue); delete (yyvsp[-2].stringValue); delete (yyvsp[0].stringValue); } -#line 2167 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2182 "sqlparser.cpp" /* yacc.c:1646 */ break; case 74: -#line 1136 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1137 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbConstExpression( KDbToken::SQL_NULL, QVariant() ); sqlParserDebug() << " + NULL"; // $$ = new KDbField(); //$$->setName(QString::null); } -#line 2178 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2193 "sqlparser.cpp" /* yacc.c:1646 */ break; case 75: -#line 1143 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1144 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbConstExpression( KDbToken::SQL_TRUE, true ); } -#line 2186 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2201 "sqlparser.cpp" /* yacc.c:1646 */ break; case 76: -#line 1147 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1148 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbConstExpression( KDbToken::SQL_FALSE, false ); } -#line 2194 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2209 "sqlparser.cpp" /* yacc.c:1646 */ break; case 77: -#line 1151 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1152 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbConstExpression( KDbToken::CHARACTER_STRING_LITERAL, *(yyvsp[0].stringValue) ); sqlParserDebug() << " + constant " << (yyvsp[0].stringValue); delete (yyvsp[0].stringValue); } -#line 2204 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2219 "sqlparser.cpp" /* yacc.c:1646 */ break; case 78: -#line 1157 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1158 "KDbSqlParser.y" /* yacc.c:1646 */ { QVariant val; if ((yyvsp[0].integerValue) <= INT_MAX && (yyvsp[0].integerValue) >= INT_MIN) @@ -2221,273 +2236,273 @@ (yyval.expr) = new KDbConstExpression( KDbToken::INTEGER_CONST, val ); sqlParserDebug() << " + int constant: " << val.toString(); } -#line 2225 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2240 "sqlparser.cpp" /* yacc.c:1646 */ break; case 79: -#line 1174 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1175 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbConstExpression( KDbToken::REAL_CONST, *(yyvsp[0].binaryValue) ); sqlParserDebug() << " + real constant: " << *(yyvsp[0].binaryValue); delete (yyvsp[0].binaryValue); } -#line 2235 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2250 "sqlparser.cpp" /* yacc.c:1646 */ break; case 80: -#line 1180 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1181 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbConstExpression(KDbToken::DATE_CONST, QVariant::fromValue(*(yyvsp[0].dateValue))); sqlParserDebug() << " + date constant:" << *(yyvsp[0].dateValue); delete (yyvsp[0].dateValue); } -#line 2245 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2260 "sqlparser.cpp" /* yacc.c:1646 */ break; case 81: -#line 1186 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1187 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbConstExpression(KDbToken::TIME_CONST, QVariant::fromValue(*(yyvsp[0].timeValue))); sqlParserDebug() << " + time constant:" << *(yyvsp[0].timeValue); delete (yyvsp[0].timeValue); } -#line 2255 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2270 "sqlparser.cpp" /* yacc.c:1646 */ break; case 82: -#line 1192 "KDbSqlParser.y" /* yacc.c:1646 */ +#line 1193 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbConstExpression(KDbToken::DATETIME_CONST, QVariant::fromValue(*(yyvsp[0].dateTimeValue))); sqlParserDebug() << " + datetime constant:" << *(yyvsp[0].dateTimeValue); delete (yyvsp[0].dateTimeValue); } -#line 2265 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2280 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 84: -#line 1203 "KDbSqlParser.y" /* yacc.c:1646 */ + case 86: +#line 1207 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.dateValue) = (yyvsp[-1].dateValue); sqlParserDebug() << "DateConst:" << *(yyval.dateValue); } -#line 2274 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2289 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 85: -#line 1211 "KDbSqlParser.y" /* yacc.c:1646 */ + case 87: +#line 1215 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.dateValue) = new KDbDate(*(yyvsp[-4].yearValue), *(yyvsp[-2].binaryValue), *(yyvsp[0].binaryValue)); sqlParserDebug() << "DateValue:" << *(yyval.dateValue); delete (yyvsp[-4].yearValue); delete (yyvsp[-2].binaryValue); delete (yyvsp[0].binaryValue); } -#line 2286 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2301 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 86: -#line 1219 "KDbSqlParser.y" /* yacc.c:1646 */ + case 88: +#line 1223 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.dateValue) = new KDbDate(*(yyvsp[0].yearValue), *(yyvsp[-4].binaryValue), *(yyvsp[-2].binaryValue)); sqlParserDebug() << "DateValue:" << *(yyval.dateValue); delete (yyvsp[-4].binaryValue); delete (yyvsp[-2].binaryValue); delete (yyvsp[0].yearValue); } -#line 2298 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2313 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 87: -#line 1230 "KDbSqlParser.y" /* yacc.c:1646 */ + case 89: +#line 1234 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.yearValue) = new KDbYear(KDbYear::Sign::None, *(yyvsp[0].binaryValue)); sqlParserDebug() << "YearConst:" << *(yyval.yearValue); delete (yyvsp[0].binaryValue); } -#line 2308 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2323 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 88: -#line 1236 "KDbSqlParser.y" /* yacc.c:1646 */ + case 90: +#line 1240 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.yearValue) = new KDbYear(KDbYear::Sign::Plus, *(yyvsp[0].binaryValue)); sqlParserDebug() << "YearConst:" << *(yyval.yearValue); delete (yyvsp[0].binaryValue); } -#line 2318 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2333 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 89: -#line 1242 "KDbSqlParser.y" /* yacc.c:1646 */ + case 91: +#line 1246 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.yearValue) = new KDbYear(KDbYear::Sign::Minus, *(yyvsp[0].binaryValue)); sqlParserDebug() << "YearConst:" << *(yyval.yearValue); delete (yyvsp[0].binaryValue); } -#line 2328 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2343 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 90: -#line 1251 "KDbSqlParser.y" /* yacc.c:1646 */ + case 92: +#line 1255 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.timeValue) = (yyvsp[-1].timeValue); sqlParserDebug() << "TimeConst:" << *(yyval.timeValue); } -#line 2337 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2352 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 91: -#line 1259 "KDbSqlParser.y" /* yacc.c:1646 */ + case 93: +#line 1263 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.timeValue) = new KDbTime(*(yyvsp[-4].binaryValue), *(yyvsp[-2].binaryValue), {}, *(yyvsp[-1].binaryValue), (yyvsp[0].timePeriodValue)); sqlParserDebug() << "TimeValue:" << *(yyval.timeValue); delete (yyvsp[-4].binaryValue); delete (yyvsp[-2].binaryValue); delete (yyvsp[-1].binaryValue); } -#line 2349 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2364 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 92: -#line 1267 "KDbSqlParser.y" /* yacc.c:1646 */ + case 94: +#line 1271 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.timeValue) = new KDbTime(*(yyvsp[-6].binaryValue), *(yyvsp[-4].binaryValue), *(yyvsp[-2].binaryValue), *(yyvsp[-1].binaryValue), (yyvsp[0].timePeriodValue)); sqlParserDebug() << "TimeValue:" << *(yyval.timeValue); delete (yyvsp[-6].binaryValue); delete (yyvsp[-4].binaryValue); delete (yyvsp[-2].binaryValue); delete (yyvsp[-1].binaryValue); } -#line 2362 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2377 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 93: -#line 1279 "KDbSqlParser.y" /* yacc.c:1646 */ + case 95: +#line 1283 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.binaryValue) = (yyvsp[0].binaryValue); } -#line 2370 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2385 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 94: -#line 1283 "KDbSqlParser.y" /* yacc.c:1646 */ + case 96: +#line 1287 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.binaryValue) = new QByteArray; } -#line 2378 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2393 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 95: -#line 1290 "KDbSqlParser.y" /* yacc.c:1646 */ + case 97: +#line 1294 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.timePeriodValue) = KDbTime::Period::Am; } -#line 2386 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2401 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 96: -#line 1294 "KDbSqlParser.y" /* yacc.c:1646 */ + case 98: +#line 1298 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.timePeriodValue) = KDbTime::Period::Pm; } -#line 2394 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2409 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 97: -#line 1298 "KDbSqlParser.y" /* yacc.c:1646 */ + case 99: +#line 1302 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.timePeriodValue) = KDbTime::Period::None; } -#line 2402 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2417 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 98: -#line 1305 "KDbSqlParser.y" /* yacc.c:1646 */ + case 100: +#line 1309 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.dateTimeValue) = new KDbDateTime(*(yyvsp[-3].dateValue), *(yyvsp[-1].timeValue)); sqlParserDebug() << "DateTimeConst:" << *(yyval.dateTimeValue); delete (yyvsp[-3].dateValue); delete (yyvsp[-1].timeValue); } -#line 2413 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2428 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 99: -#line 1315 "KDbSqlParser.y" /* yacc.c:1646 */ + case 101: +#line 1319 "KDbSqlParser.y" /* yacc.c:1646 */ { sqlParserDebug() << "(expr)"; (yyval.expr) = new KDbUnaryExpression('(', *(yyvsp[-1].expr)); delete (yyvsp[-1].expr); } -#line 2423 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2438 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 100: -#line 1324 "KDbSqlParser.y" /* yacc.c:1646 */ + case 102: +#line 1328 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.exprList) = (yyvsp[-1].exprList); } -#line 2431 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2446 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 101: -#line 1328 "KDbSqlParser.y" /* yacc.c:1646 */ + case 103: +#line 1332 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.exprList) = new KDbNArgExpression(KDb::ArgumentListExpression, ','); } -#line 2439 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2454 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 102: -#line 1335 "KDbSqlParser.y" /* yacc.c:1646 */ + case 104: +#line 1339 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.exprList) = (yyvsp[0].exprList); (yyval.exprList)->prepend( *(yyvsp[-2].expr) ); delete (yyvsp[-2].expr); } -#line 2449 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2464 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 103: -#line 1341 "KDbSqlParser.y" /* yacc.c:1646 */ + case 105: +#line 1345 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.exprList) = new KDbNArgExpression(KDb::ArgumentListExpression, ','); (yyval.exprList)->append( *(yyvsp[0].expr) ); delete (yyvsp[0].expr); } -#line 2459 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2474 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 104: -#line 1350 "KDbSqlParser.y" /* yacc.c:1646 */ + case 106: +#line 1354 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.exprList) = (yyvsp[0].exprList); } -#line 2467 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2482 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 105: -#line 1395 "KDbSqlParser.y" /* yacc.c:1646 */ + case 107: +#line 1399 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.exprList) = (yyvsp[-2].exprList); (yyval.exprList)->append(*(yyvsp[0].expr)); delete (yyvsp[0].expr); } -#line 2477 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2492 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 106: -#line 1401 "KDbSqlParser.y" /* yacc.c:1646 */ + case 108: +#line 1405 "KDbSqlParser.y" /* yacc.c:1646 */ { - (yyval.exprList) = new KDbNArgExpression(KDb::TableListExpression, KDbToken::IDENTIFIER); //ok? + (yyval.exprList) = new KDbNArgExpression(KDb::TableListExpression, KDbToken::UNQUOTED_IDENTIFIER); //ok? (yyval.exprList)->append(*(yyvsp[0].expr)); delete (yyvsp[0].expr); } -#line 2487 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2502 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 107: -#line 1410 "KDbSqlParser.y" /* yacc.c:1646 */ + case 109: +#line 1414 "KDbSqlParser.y" /* yacc.c:1646 */ { sqlParserDebug() << "FROM: '" << *(yyvsp[0].stringValue) << "'"; (yyval.expr) = new KDbVariableExpression(*(yyvsp[0].stringValue)); @@ -2515,11 +2530,11 @@ }*/ delete (yyvsp[0].stringValue); } -#line 2519 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2534 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 108: -#line 1438 "KDbSqlParser.y" /* yacc.c:1646 */ + case 110: +#line 1442 "KDbSqlParser.y" /* yacc.c:1646 */ { //table + alias (yyval.expr) = new KDbBinaryExpression( @@ -2529,11 +2544,11 @@ delete (yyvsp[-1].stringValue); delete (yyvsp[0].stringValue); } -#line 2533 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2548 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 109: -#line 1448 "KDbSqlParser.y" /* yacc.c:1646 */ + case 111: +#line 1452 "KDbSqlParser.y" /* yacc.c:1646 */ { //table + alias (yyval.expr) = new KDbBinaryExpression( @@ -2543,55 +2558,55 @@ delete (yyvsp[-2].stringValue); delete (yyvsp[0].stringValue); } -#line 2547 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2562 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 110: -#line 1463 "KDbSqlParser.y" /* yacc.c:1646 */ + case 112: +#line 1467 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.exprList) = (yyvsp[-2].exprList); (yyval.exprList)->append(*(yyvsp[0].expr)); delete (yyvsp[0].expr); sqlParserDebug() << "ColViews: ColViews , ColItem"; } -#line 2558 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2573 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 111: -#line 1470 "KDbSqlParser.y" /* yacc.c:1646 */ + case 113: +#line 1474 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.exprList) = new KDbNArgExpression(KDb::FieldListExpression, KDbToken()); (yyval.exprList)->append(*(yyvsp[0].expr)); delete (yyvsp[0].expr); sqlParserDebug() << "ColViews: ColItem"; } -#line 2569 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2584 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 112: -#line 1480 "KDbSqlParser.y" /* yacc.c:1646 */ + case 114: +#line 1484 "KDbSqlParser.y" /* yacc.c:1646 */ { // $$ = new KDbField(); // dummy->addField($$); // $$->setExpression( $1 ); // globalParser->query()->addField($$); (yyval.expr) = (yyvsp[0].expr); sqlParserDebug() << " added column expr:" << *(yyvsp[0].expr); } -#line 2582 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2597 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 113: -#line 1489 "KDbSqlParser.y" /* yacc.c:1646 */ + case 115: +#line 1493 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[0].expr); sqlParserDebug() << " added column wildcard:" << *(yyvsp[0].expr); } -#line 2591 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2606 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 114: -#line 1494 "KDbSqlParser.y" /* yacc.c:1646 */ + case 116: +#line 1498 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression( *(yyvsp[-2].expr), KDbToken::AS, @@ -2601,11 +2616,11 @@ delete (yyvsp[-2].expr); delete (yyvsp[0].stringValue); } -#line 2605 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2620 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 115: -#line 1504 "KDbSqlParser.y" /* yacc.c:1646 */ + case 117: +#line 1508 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbBinaryExpression( *(yyvsp[-1].expr), KDbToken::AS_EMPTY, @@ -2615,54 +2630,54 @@ delete (yyvsp[-1].expr); delete (yyvsp[0].stringValue); } -#line 2619 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2634 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 116: -#line 1517 "KDbSqlParser.y" /* yacc.c:1646 */ + case 118: +#line 1521 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[0].expr); } -#line 2627 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2642 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 117: -#line 1563 "KDbSqlParser.y" /* yacc.c:1646 */ + case 119: +#line 1567 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[-1].expr); //! @todo DISTINCT '(' ColExpression ')' // $$->setName("DISTINCT(" + $3->name() + ")"); } -#line 2637 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2652 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 118: -#line 1572 "KDbSqlParser.y" /* yacc.c:1646 */ + case 120: +#line 1576 "KDbSqlParser.y" /* yacc.c:1646 */ { (yyval.expr) = new KDbVariableExpression(QLatin1String("*")); sqlParserDebug() << "all columns"; // KDbQueryAsterisk *ast = new KDbQueryAsterisk(globalParser->query(), dummy); // globalParser->query()->addAsterisk(ast); // requiresTable = true; } -#line 2650 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2665 "sqlparser.cpp" /* yacc.c:1646 */ break; - case 119: -#line 1581 "KDbSqlParser.y" /* yacc.c:1646 */ + case 121: +#line 1585 "KDbSqlParser.y" /* yacc.c:1646 */ { QString s( *(yyvsp[-2].stringValue) ); s += QLatin1String(".*"); (yyval.expr) = new KDbVariableExpression(s); sqlParserDebug() << " + all columns from " << s; delete (yyvsp[-2].stringValue); } -#line 2662 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2677 "sqlparser.cpp" /* yacc.c:1646 */ break; -#line 2666 "sqlparser.cpp" /* yacc.c:1646 */ +#line 2681 "sqlparser.cpp" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -2890,7 +2905,7 @@ #endif return yyresult; } -#line 1596 "KDbSqlParser.y" /* yacc.c:1906 */ +#line 1600 "KDbSqlParser.y" /* yacc.c:1906 */ KDB_TESTING_EXPORT const char* g_tokenName(unsigned int offset) { diff --git a/src/parser/generated/sqlscanner.cpp b/src/parser/generated/sqlscanner.cpp --- a/src/parser/generated/sqlscanner.cpp +++ b/src/parser/generated/sqlscanner.cpp @@ -1402,18 +1402,18 @@ return SCAN_ERROR; } yylval.stringValue = new QString(QString::fromUtf8(yytext, yyleng)); - return IDENTIFIER; + return UNQUOTED_IDENTIFIER; } YY_BREAK case 52: /* rule 52 can match eol */ YY_RULE_SETUP #line 362 "KDbSqlScanner.l" { - sqlParserDebug() << "{query_parameter} yytext: '" << yytext << "' (" << yyleng << ")"; + sqlParserDebug() << "{identifier_or_query_parameter} yytext: '" << yytext << "' (" << yyleng << ")"; ECOUNT; yylval.stringValue = new QString(QString::fromUtf8(yytext+1, yyleng-2)); - return QUERY_PARAMETER; + return IDENTIFIER_OR_QUERY_PARAMETER; } YY_BREAK case 53: