PageRenderTime 27ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/src/parser/KDbSqlParser.y

https://gitlab.com/LongAiR/KDb
Happy | 1449 lines | 1374 code | 75 blank | 0 comment | 0 complexity | ce89f8036f438dff06d207c1ab1c0df6 MD5 | raw file
  1. /* This file is part of the KDE project
  2. Copyright (C) 2004 Lucijan Busch <lucijan@kde.org>
  3. Copyright (C) 2004-2016 Jarosław Staniek <staniek@kde.org>
  4. This library is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Library General Public
  6. License as published by the Free Software Foundation; either
  7. version 2 of the License, or (at your option) any later version.
  8. This library is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. Library General Public License for more details.
  12. You should have received a copy of the GNU Library General Public License
  13. along with this library; see the file COPYING.LIB. If not, write to
  14. the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  15. Boston, MA 02110-1301, USA.
  16. */
  17. // To keep binary compatibility, do not reorder tokens! Add new only at the end.
  18. %token SQL_TYPE
  19. %token AS
  20. %token AS_EMPTY /* used for aliases with skipped AS keyword */
  21. %token ASC
  22. %token AUTO_INCREMENT
  23. %token BIT
  24. %token BITWISE_SHIFT_LEFT
  25. %token BITWISE_SHIFT_RIGHT
  26. %token BY
  27. %token CHARACTER_STRING_LITERAL
  28. %token CONCATENATION /* || */
  29. %token CREATE
  30. %token DESC
  31. %token DISTINCT
  32. %token DOUBLE_QUOTED_STRING
  33. %token FROM
  34. %token JOIN
  35. %token KEY
  36. %token LEFT
  37. %token LESS_OR_EQUAL
  38. %token GREATER_OR_EQUAL
  39. %token SQL_NULL
  40. %token SQL_IS
  41. %token SQL_IS_NULL /*helper */
  42. %token SQL_IS_NOT_NULL /*helper */
  43. %token ORDER
  44. %token PRIMARY
  45. %token SELECT
  46. %token INTEGER_CONST
  47. %token REAL_CONST
  48. %token RIGHT
  49. %token SQL_ON
  50. %token DATE_CONST
  51. %token DATETIME_CONST
  52. %token TIME_CONST
  53. %token TABLE
  54. %token IDENTIFIER
  55. %token IDENTIFIER_DOT_ASTERISK
  56. %token QUERY_PARAMETER
  57. %token VARCHAR
  58. %token WHERE
  59. %token SQL
  60. %token SQL_TRUE
  61. %token SQL_FALSE
  62. %token UNION
  63. %token SCAN_ERROR
  64. //%token SQL_ABS
  65. //%token ACOS
  66. //%token AMPERSAND
  67. //%token SQL_ABSOLUTE
  68. //%token ADA
  69. //%token ADD
  70. //%token ADD_DAYS
  71. //%token ADD_HOURS
  72. //%token ADD_MINUTES
  73. //%token ADD_MONTHS
  74. //%token ADD_SECONDS
  75. //%token ADD_YEARS
  76. //%token ALL
  77. //%token ALLOCATE
  78. //%token ALTER
  79. %token AND
  80. //%token ANY
  81. //%token ARE
  82. //%token ASIN
  83. //%token ASCII
  84. //%token ASSERTION
  85. //%token ATAN
  86. //%token ATAN2
  87. //%token AUTHORIZATION
  88. //%token AVG
  89. //%token BEFORE
  90. %token BETWEEN
  91. %token NOT_BETWEEN
  92. //%token SQL_BEGIN
  93. //%token BIGINT
  94. //%token BINARY
  95. //%token BIT_LENGTH
  96. //%token BREAK
  97. //%token CASCADE
  98. //%token CASCADED
  99. //%token CASE
  100. //%token CAST
  101. //%token CATALOG
  102. //%token CEILING
  103. //%token CENTER
  104. //%token SQL_CHAR
  105. //%token CHAR_LENGTH
  106. //%token CHECK
  107. //%token CLOSE
  108. //%token COALESCE
  109. //%token COBOL
  110. //%token COLLATE
  111. //%token COLLATION
  112. //%token COLUMN
  113. //%token COMMIT
  114. //%token COMPUTE
  115. //%token CONCAT
  116. //%token CONNECT
  117. //%token CONNECTION
  118. //%token CONSTRAINT
  119. //%token CONSTRAINTS
  120. //%token CONTINUE
  121. //%token CONVERT
  122. //%token CORRESPONDING
  123. //%token COS
  124. //%token COT
  125. //%token COUNT
  126. //%token CURDATE
  127. //%token CURRENT
  128. //%token CURRENT_DATE
  129. //%token CURRENT_TIME
  130. //%token CURRENT_TIMESTAMP
  131. //%token CURTIME
  132. //%token CURSOR
  133. //%token DATABASE
  134. //%token SQL_DATE
  135. //%token DATE_FORMAT
  136. //%token DATE_REMAINDER
  137. //%token DATE_VALUE
  138. //%token DAY
  139. //%token DAYOFMONTH
  140. //%token DAYOFWEEK
  141. //%token DAYOFYEAR
  142. //%token DAYS_BETWEEN
  143. //%token DEALLOCATE
  144. //%token DEC
  145. //%token DECLARE
  146. //%token DEFAULT
  147. //%token DEFERRABLE
  148. //%token DEFERRED
  149. //%token SQL_DELETE
  150. //%token DESCRIBE
  151. //%token DESCRIPTOR
  152. //%token DIAGNOSTICS
  153. //%token DICTIONARY
  154. //%token DIRECTORY
  155. //%token DISCONNECT
  156. //%token DISPLACEMENT
  157. //%token DOMAIN_TOKEN
  158. //%token SQL_DOUBLE
  159. //%token DROP
  160. //%token ELSE
  161. //%token END
  162. //%token END_EXEC
  163. //%token ESCAPE
  164. %token EXCEPT
  165. //%token SQL_EXCEPTION
  166. //%token EXEC
  167. //%token EXECUTE
  168. //%token EXISTS
  169. //%token EXP
  170. //%token EXPONENT
  171. //%token EXTERNAL
  172. //%token EXTRACT
  173. //%token FETCH
  174. //%token FIRST
  175. //%token SQL_FLOAT
  176. //%token FLOOR
  177. //%token FN
  178. //%token FOR
  179. //%token FOREIGN
  180. //%token FORTRAN
  181. //%token FOUND
  182. //%token FOUR_DIGITS
  183. //%token FULL
  184. //%token GET
  185. //%token GLOBAL
  186. //%token GO
  187. //%token GOTO
  188. //%token GRANT
  189. //conflict %token GROUP
  190. //%token HAVING
  191. //%token HOUR
  192. //%token HOURS_BETWEEN
  193. //%token IDENTITY
  194. //%token IFNULL
  195. //%token SQL_IGNORE
  196. //%token IMMEDIATE
  197. //%token INCLUDE
  198. //%token INDEX
  199. //%token INDICATOR
  200. //%token INITIALLY
  201. //%token INNER
  202. //%token SQL_INPUT
  203. %token SQL_IN
  204. //%token INSENSITIVE
  205. //%token INSERT
  206. //%token INTEGER
  207. %token INTERSECT
  208. //%token INTERVAL
  209. //%token INTO
  210. //%token IS
  211. //%token ISOLATION
  212. //%token JUSTIFY
  213. //%token LANGUAGE
  214. //%token LAST
  215. //%token LCASE
  216. //%token LENGTH
  217. //%token LEVEL
  218. %token LIKE
  219. %token ILIKE
  220. %token NOT_LIKE
  221. //%token LINE_WIDTH
  222. //%token LOCAL
  223. //%token LOCATE
  224. //%token LOG
  225. //%token SQL_LONG
  226. //%token LOWER
  227. //%token LTRIM
  228. //%token LTRIP
  229. //%token MATCH
  230. //%token SQL_MAX
  231. //%token MICROSOFT
  232. //%token SQL_MIN
  233. //%token MINUTE
  234. //%token MINUTES_BETWEEN
  235. //%token MOD
  236. //%token MODIFY
  237. //%token MODULE
  238. //%token MONTH
  239. //%token MONTHS_BETWEEN
  240. //%token MUMPS
  241. //%token NAMES
  242. //%token NATIONAL
  243. //%token NCHAR
  244. //%token NEXT
  245. //%token NODUP
  246. //%token NONE
  247. %token NOT
  248. %token NOT_EQUAL
  249. %token NOT_EQUAL2
  250. //%token NOW
  251. //%token NULLIF
  252. //%token NUMERIC
  253. //%token OCTET_LENGTH
  254. //%token ODBC
  255. //%token OF
  256. //%token SQL_OFF
  257. //%token ONLY
  258. //%token OPEN
  259. //%token OPTION
  260. //%token OUTER
  261. //%token OUTPUT
  262. //%token OVERLAPS
  263. //%token PAGE
  264. //%token PARTIAL
  265. //%token SQL_PASCAL
  266. //%token PERSISTENT
  267. //%token CQL_PI
  268. %token OR
  269. //%token PLI
  270. //%token POSITION
  271. //%token PRECISION
  272. //%token PREPARE
  273. //%token PRESERVE
  274. //%token PRIOR
  275. //%token PRIVILEGES
  276. //%token PROCEDURE
  277. //%token PRODUCT
  278. //%token PUBLIC
  279. //%token QUARTER
  280. //%token QUIT
  281. //%token RAND
  282. //%token READ_ONLY
  283. //%token REAL
  284. //%token REFERENCES
  285. //%token REPEAT
  286. //%token REPLACE
  287. //%token RESTRICT
  288. //%token REVOKE
  289. //%token ROLLBACK
  290. //%token ROWS
  291. //%token RPAD
  292. //%token RTRIM
  293. //%token SCHEMA
  294. //%token SCREEN_WIDTH
  295. //%token SCROLL
  296. //%token SECOND
  297. //%token SECONDS_BETWEEN
  298. //%token SEQUENCE
  299. //%token SETOPT
  300. //%token SET
  301. //%token SHOWOPT
  302. //%token SIGN
  303. %token SIMILAR_TO
  304. %token NOT_SIMILAR_TO
  305. //%token SIN
  306. //%token SQL_SIZE
  307. //%token SMALLINT
  308. //%token SOME
  309. //%token SPACE
  310. //%token SQLCA
  311. //%token SQLCODE
  312. //%token SQLERROR
  313. //%token SQLSTATE
  314. //%token SQLWARNING
  315. //%token SQRT
  316. //%token STDEV
  317. //%token SUBSTRING
  318. //%token SUM
  319. //%token SYSDATE
  320. //%token SYSDATE_FORMAT
  321. //%token SYSTEM
  322. //%token TAN
  323. //%token TEMPORARY
  324. //%token THEN
  325. //%token THREE_DIGITS
  326. //%token TIME
  327. //%token TIMESTAMP
  328. //%token TIMEZONE_HOUR
  329. //%token TIMEZONE_MINUTE
  330. //%token TINYINT
  331. //%token TO
  332. //%token TO_CHAR
  333. //%token TO_DATE
  334. //%token TRANSACTION
  335. //%token TRANSLATE
  336. //%token TRANSLATION
  337. //%token TRUNCATE
  338. //%token GENERAL_TITLE
  339. //%token TWO_DIGITS
  340. //%token UCASE
  341. //%token UNIQUE
  342. //%token SQL_UNKNOWN
  343. //%token UNSIGNED_INTEGER
  344. //%token UPDATE
  345. //%token UPPER
  346. //%token USAGE
  347. //%token USER
  348. //%token ERROR_DIGIT_BEFORE_IDENTIFIER
  349. //%token USING
  350. //%token VALUE
  351. //%token VALUES
  352. //%token VARBINARY
  353. //%token VARYING
  354. //%token VENDOR
  355. //%token VIEW
  356. //%token WEEK
  357. //%token WHEN
  358. //%token WHENEVER
  359. //%token WHERE_CURRENT_OF
  360. //%token WITH
  361. //%token WORD_WRAPPED
  362. //%token WORK
  363. //%token WRAPPED
  364. %token XOR
  365. //%token YEAR
  366. //%token YEARS_BETWEEN
  367. %type <stringValue> IDENTIFIER
  368. %type <stringValue> IDENTIFIER_DOT_ASTERISK
  369. %type <stringValue> QUERY_PARAMETER
  370. %type <stringValue> CHARACTER_STRING_LITERAL
  371. %type <stringValue> DOUBLE_QUOTED_STRING
  372. /*
  373. %type <field> ColExpression
  374. %type <field> ColView
  375. */
  376. %type <expr> ColExpression
  377. %type <expr> ColWildCard
  378. //%type <expr> ColView
  379. %type <expr> ColItem
  380. %type <exprList> ColViews
  381. %type <expr> aExpr
  382. %type <expr> aExpr2
  383. %type <expr> aExpr3
  384. %type <expr> aExpr4
  385. %type <expr> aExpr5
  386. %type <expr> aExpr6
  387. %type <expr> aExpr7
  388. %type <expr> aExpr8
  389. %type <expr> aExpr9
  390. %type <expr> aExpr10
  391. %type <exprList> aExprList
  392. %type <exprList> aExprList2
  393. %type <expr> WhereClause
  394. %type <orderByColumns> OrderByClause
  395. %type <sortOrderValue> OrderByOption
  396. %type <variantValue> OrderByColumnId
  397. %type <selectOptions> SelectOptions
  398. %type <expr> FlatTable
  399. %type <exprList> Tables
  400. %type <exprList> FlatTableList
  401. %type <querySchema> SelectStatement
  402. %type <querySchema> Select
  403. /*todo : list*/
  404. %type <querySchema> StatementList
  405. /*todo: not onlu select*/
  406. %type <querySchema> Statement
  407. %type <colType> SQL_TYPE
  408. %type <integerValue> INTEGER_CONST
  409. %type <binaryValue> REAL_CONST
  410. /*%type <integerValue> SIGNED_INTEGER */
  411. %{
  412. #include <stdio.h>
  413. #include <string.h>
  414. #include <string>
  415. #include <iostream>
  416. #include <limits.h>
  417. //! @todo OK?
  418. #ifdef Q_OS_WIN
  419. //workaround for bug on msvc
  420. # undef LLONG_MIN
  421. #endif
  422. #ifndef LLONG_MAX
  423. # define LLONG_MAX 0x7fffffffffffffffLL
  424. #endif
  425. #ifndef LLONG_MIN
  426. # define LLONG_MIN 0x8000000000000000LL
  427. #endif
  428. #ifndef LLONG_MAX
  429. # define ULLONG_MAX 0xffffffffffffffffLL
  430. #endif
  431. #ifdef _WIN32
  432. # include <malloc.h>
  433. #endif
  434. #include <QObject>
  435. #include <QVariant>
  436. #include <QPoint>
  437. #include "KDbConnection.h"
  438. #include "KDbExpression.h"
  439. #include "KDbField.h"
  440. #include "KDbOrderByColumn.h"
  441. #include "KDbParser.h"
  442. #include "KDbParser_p.h"
  443. #include "KDbQuerySchema.h"
  444. #include "KDbQuerySchema_p.h"
  445. #include "KDbSqlTypes.h"
  446. #include "KDbTableSchema.h"
  447. #include "kdb_debug.h"
  448. struct OrderByColumnInternal;
  449. #ifdef Q_OS_SOLARIS
  450. #include <alloca.h>
  451. #endif
  452. QDebug operator<<(QDebug dbg, const KDbExpressionPtr& expr)
  453. {
  454. dbg.nospace() << expr.e;
  455. return dbg.space();
  456. }
  457. int yylex();
  458. #define YY_NO_UNPUT
  459. #define YYSTACK_USE_ALLOCA 1
  460. #define YYMAXDEPTH 255
  461. extern "C"
  462. {
  463. int yywrap()
  464. {
  465. return 1;
  466. }
  467. }
  468. %}
  469. %union {
  470. QString* stringValue;
  471. QByteArray* binaryValue;
  472. qint64 integerValue;
  473. bool booleanValue;
  474. KDbOrderByColumn::SortOrder sortOrderValue;
  475. KDbField::Type colType;
  476. KDbField *field;
  477. KDbExpression *expr;
  478. KDbNArgExpression *exprList;
  479. KDbConstExpression *constExpression;
  480. KDbQuerySchema *querySchema;
  481. SelectOptionsInternal *selectOptions;
  482. QList<OrderByColumnInternal> *orderByColumns;
  483. QVariant *variantValue;
  484. }
  485. /* precedence: lowest to highest */
  486. //%nonassoc SIMILAR
  487. //%nonassoc ESCAPE
  488. //%nonassoc OVERLAPS
  489. //%nonassoc IN_P
  490. //%left POSTFIXOP // dummy for postfix Op rules
  491. //%left Op OPERATOR // multi-character ops and user-defined operators
  492. //%nonassoc NOTNULL
  493. //%nonassoc ISNULL
  494. //%nonassoc IS // sets precedence for IS NULL, etc
  495. //%nonassoc NULL_P
  496. //%nonassoc TRUE_P
  497. //%nonassoc FALSE_P
  498. %token UMINUS
  499. // <-- To keep binary compatibility insert new tokens here.
  500. /*
  501. * These might seem to be low-precedence, but actually they are not part
  502. * of the arithmetic hierarchy at all in their use as JOIN operators.
  503. * We make them high-precedence to support their use as function names.
  504. * They wouldn't be given a precedence at all, were it not that we need
  505. * left-associativity among the JOIN rules themselves.
  506. */
  507. /*
  508. %left JOIN
  509. %left UNIONJOIN
  510. %left CROSS
  511. %left LEFT
  512. %left FULL
  513. %left RIGHT
  514. %left INNER_P
  515. %left NATURAL
  516. */
  517. %%
  518. TopLevelStatement :
  519. StatementList
  520. {
  521. //todo: multiple statements
  522. //todo: not only "select" statements
  523. KDbParserPrivate::get(globalParser)->setStatementType(KDbParser::Select);
  524. KDbParserPrivate::get(globalParser)->setQuerySchema($1);
  525. }
  526. ;
  527. StatementList:
  528. Statement ';' StatementList
  529. {
  530. //todo: multiple statements
  531. }
  532. | Statement
  533. | Statement ';'
  534. {
  535. $$ = $1;
  536. }
  537. ;
  538. /* Statement CreateTableStatement { YYACCEPT; }
  539. | Statement SelectStatement { }
  540. */
  541. Statement :
  542. /*CreateTableStatement
  543. {
  544. YYACCEPT;
  545. }
  546. | */
  547. SelectStatement
  548. {
  549. $$ = $1;
  550. }
  551. ;
  552. /*CreateTableStatement :
  553. CREATE TABLE IDENTIFIER
  554. {
  555. globalParser->setStatementType(KDbParser::CreateTable);
  556. globalParser->createTable($3->toLatin1());
  557. delete $3;
  558. }
  559. '(' ColDefs ')'
  560. ;
  561. ColDefs:
  562. ColDefs ',' ColDef|ColDef
  563. {
  564. }
  565. ;
  566. ColDef:
  567. IDENTIFIER ColType
  568. {
  569. kdbDebug() << "adding field " << *$1;
  570. globalField->setName(*$1);
  571. globalParser->table()->addField(globalField);
  572. globalField = nullptr;
  573. delete $1;
  574. }
  575. | IDENTIFIER ColType ColKeys
  576. {
  577. kdbDebug() << "adding field " << *$1;
  578. globalField->setName(*$1);
  579. delete $1;
  580. globalParser->table()->addField(globalField);
  581. // if(globalField->isPrimaryKey())
  582. // globalParser->table()->addPrimaryKey(globalField->name());
  583. // delete globalField;
  584. // globalField = nullptr;
  585. }
  586. ;
  587. ColKeys:
  588. ColKeys ColKey|ColKey
  589. {
  590. }
  591. ;
  592. ColKey:
  593. PRIMARY KEY
  594. {
  595. globalField->setPrimaryKey(true);
  596. kdbDebug() << "primary";
  597. }
  598. | NOT SQL_NULL
  599. {
  600. globalField->setNotNull(true);
  601. kdbDebug() << "not_null";
  602. }
  603. | AUTO_INCREMENT
  604. {
  605. globalField->setAutoIncrement(true);
  606. kdbDebug() << "ainc";
  607. }
  608. ;
  609. ColType:
  610. SQL_TYPE
  611. {
  612. globalField = new KDbField();
  613. globalField->setType($1);
  614. }
  615. | SQL_TYPE '(' INTEGER_CONST ')'
  616. {
  617. kdbDebug() << "sql + length";
  618. globalField = new KDbField();
  619. globalField->setPrecision($3);
  620. globalField->setType($1);
  621. }
  622. | VARCHAR '(' INTEGER_CONST ')'
  623. {
  624. globalField = new KDbField();
  625. globalField->setPrecision($3);
  626. globalField->setType(KDbField::Text);
  627. }
  628. |
  629. %empty
  630. {
  631. // SQLITE compatibillity
  632. globalField = new KDbField();
  633. globalField->setType(KDbField::InvalidType);
  634. }
  635. ;*/
  636. SelectStatement:
  637. Select
  638. {
  639. kdbDebug() << "Select";
  640. if (!($$ = buildSelectQuery( $1, 0 )))
  641. return 0;
  642. }
  643. | Select ColViews
  644. {
  645. kdbDebug() << "Select ColViews=" << *$2;
  646. if (!($$ = buildSelectQuery( $1, $2 )))
  647. return 0;
  648. }
  649. | Select ColViews Tables
  650. {
  651. if (!($$ = buildSelectQuery( $1, $2, $3 )))
  652. return 0;
  653. }
  654. | Select Tables
  655. {
  656. kdbDebug() << "Select ColViews Tables";
  657. if (!($$ = buildSelectQuery( $1, 0, $2 )))
  658. return 0;
  659. }
  660. | Select ColViews SelectOptions
  661. {
  662. kdbDebug() << "Select ColViews Conditions";
  663. if (!($$ = buildSelectQuery( $1, $2, 0, $3 )))
  664. return 0;
  665. }
  666. | Select Tables SelectOptions
  667. {
  668. kdbDebug() << "Select Tables SelectOptions";
  669. if (!($$ = buildSelectQuery( $1, 0, $2, $3 )))
  670. return 0;
  671. }
  672. | Select ColViews Tables SelectOptions
  673. {
  674. kdbDebug() << "Select ColViews Tables SelectOptions";
  675. if (!($$ = buildSelectQuery( $1, $2, $3, $4 )))
  676. return 0;
  677. }
  678. ;
  679. Select:
  680. SELECT
  681. {
  682. kdbDebug() << "SELECT";
  683. $$ = KDbParserPrivate::get(globalParser)->createQuery();
  684. }
  685. ;
  686. SelectOptions: /* todo: more options (having, group by, limit...) */
  687. WhereClause
  688. {
  689. kdbDebug() << "WhereClause";
  690. $$ = new SelectOptionsInternal;
  691. $$->whereExpr = *$1;
  692. delete $1;
  693. }
  694. | ORDER BY OrderByClause
  695. {
  696. kdbDebug() << "OrderByClause";
  697. $$ = new SelectOptionsInternal;
  698. $$->orderByColumns = $3;
  699. }
  700. | WhereClause ORDER BY OrderByClause
  701. {
  702. kdbDebug() << "WhereClause ORDER BY OrderByClause";
  703. $$ = new SelectOptionsInternal;
  704. $$->whereExpr = *$1;
  705. delete $1;
  706. $$->orderByColumns = $4;
  707. }
  708. | ORDER BY OrderByClause WhereClause
  709. {
  710. kdbDebug() << "OrderByClause WhereClause";
  711. $$ = new SelectOptionsInternal;
  712. $$->whereExpr = *$4;
  713. delete $4;
  714. $$->orderByColumns = $3;
  715. }
  716. ;
  717. WhereClause:
  718. WHERE aExpr
  719. {
  720. $$ = $2;
  721. }
  722. ;
  723. /* todo: support "ORDER BY NULL" as described here http://dev.mysql.com/doc/refman/5.1/en/select.html */
  724. /* todo: accept expr and position as well */
  725. OrderByClause:
  726. OrderByColumnId
  727. {
  728. kdbDebug() << "ORDER BY IDENTIFIER";
  729. $$ = new QList<OrderByColumnInternal>;
  730. OrderByColumnInternal orderByColumn;
  731. orderByColumn.setColumnByNameOrNumber( *$1 );
  732. $$->append( orderByColumn );
  733. delete $1;
  734. }
  735. | OrderByColumnId OrderByOption
  736. {
  737. kdbDebug() << "ORDER BY IDENTIFIER OrderByOption";
  738. $$ = new QList<OrderByColumnInternal>;
  739. OrderByColumnInternal orderByColumn;
  740. orderByColumn.setColumnByNameOrNumber( *$1 );
  741. orderByColumn.order = $2;
  742. $$->append( orderByColumn );
  743. delete $1;
  744. }
  745. | OrderByColumnId ',' OrderByClause
  746. {
  747. $$ = $3;
  748. OrderByColumnInternal orderByColumn;
  749. orderByColumn.setColumnByNameOrNumber( *$1 );
  750. $$->append( orderByColumn );
  751. delete $1;
  752. }
  753. | OrderByColumnId OrderByOption ',' OrderByClause
  754. {
  755. $$ = $4;
  756. OrderByColumnInternal orderByColumn;
  757. orderByColumn.setColumnByNameOrNumber( *$1 );
  758. orderByColumn.order = $2;
  759. $$->append( orderByColumn );
  760. delete $1;
  761. }
  762. ;
  763. OrderByColumnId:
  764. IDENTIFIER
  765. {
  766. $$ = new QVariant( *$1 );
  767. kdbDebug() << "OrderByColumnId: " << *$$;
  768. delete $1;
  769. }
  770. | IDENTIFIER '.' IDENTIFIER
  771. {
  772. $$ = new QVariant( *$1 + QLatin1Char('.') + *$3 );
  773. kdbDebug() << "OrderByColumnId: " << *$$;
  774. delete $1;
  775. delete $3;
  776. }
  777. | INTEGER_CONST
  778. {
  779. $$ = new QVariant($1);
  780. kdbDebug() << "OrderByColumnId: " << *$$;
  781. }
  782. OrderByOption:
  783. ASC
  784. {
  785. $$ = KDbOrderByColumn::SortOrder::Ascending;
  786. }
  787. | DESC
  788. {
  789. $$ = KDbOrderByColumn::SortOrder::Descending;
  790. }
  791. ;
  792. aExpr:
  793. aExpr2
  794. ;
  795. /* --- binary logical --- */
  796. aExpr2:
  797. aExpr3 AND aExpr2
  798. {
  799. // kdbDebug() << "AND " << $3.debugString();
  800. $$ = new KDbBinaryExpression(*$1, KDbToken::AND, *$3);
  801. delete $1;
  802. delete $3;
  803. }
  804. | aExpr3 OR aExpr2
  805. {
  806. $$ = new KDbBinaryExpression(*$1, KDbToken::OR, *$3);
  807. delete $1;
  808. delete $3;
  809. }
  810. | aExpr3 XOR aExpr2
  811. {
  812. $$ = new KDbBinaryExpression(*$1, KDbToken::XOR, *$3);
  813. delete $1;
  814. delete $3;
  815. }
  816. |
  817. aExpr3
  818. ;
  819. /* relational op precedence */
  820. aExpr3:
  821. aExpr4 '>' %prec GREATER_OR_EQUAL aExpr3
  822. {
  823. $$ = new KDbBinaryExpression(*$1, '>', *$3);
  824. delete $1;
  825. delete $3;
  826. }
  827. | aExpr4 GREATER_OR_EQUAL aExpr3
  828. {
  829. $$ = new KDbBinaryExpression(*$1, KDbToken::GREATER_OR_EQUAL, *$3);
  830. delete $1;
  831. delete $3;
  832. }
  833. | aExpr4 '<' %prec LESS_OR_EQUAL aExpr3
  834. {
  835. $$ = new KDbBinaryExpression(*$1, '<', *$3);
  836. delete $1;
  837. delete $3;
  838. }
  839. | aExpr4 LESS_OR_EQUAL aExpr3
  840. {
  841. $$ = new KDbBinaryExpression(*$1, KDbToken::LESS_OR_EQUAL, *$3);
  842. delete $1;
  843. delete $3;
  844. }
  845. | aExpr4 '=' aExpr3
  846. {
  847. $$ = new KDbBinaryExpression(*$1, '=', *$3);
  848. delete $1;
  849. delete $3;
  850. }
  851. |
  852. aExpr4
  853. ;
  854. /* relational (equality) op precedence */
  855. aExpr4:
  856. aExpr5 NOT_EQUAL aExpr4
  857. {
  858. $$ = new KDbBinaryExpression(*$1, KDbToken::NOT_EQUAL, *$3);
  859. delete $1;
  860. delete $3;
  861. }
  862. | aExpr5 NOT_EQUAL2 aExpr4
  863. {
  864. $$ = new KDbBinaryExpression(*$1, KDbToken::NOT_EQUAL2, *$3);
  865. delete $1;
  866. delete $3;
  867. }
  868. | aExpr5 LIKE aExpr4
  869. {
  870. $$ = new KDbBinaryExpression(*$1, KDbToken::LIKE, *$3);
  871. delete $1;
  872. delete $3;
  873. }
  874. | aExpr5 NOT_LIKE aExpr4
  875. {
  876. $$ = new KDbBinaryExpression(*$1, KDbToken::NOT_LIKE, *$3);
  877. delete $1;
  878. delete $3;
  879. }
  880. | aExpr5 SQL_IN aExpr4
  881. {
  882. $$ = new KDbBinaryExpression(*$1, KDbToken::SQL_IN, *$3);
  883. delete $1;
  884. delete $3;
  885. }
  886. | aExpr5 SIMILAR_TO aExpr4
  887. {
  888. $$ = new KDbBinaryExpression(*$1, KDbToken::SIMILAR_TO, *$3);
  889. delete $1;
  890. delete $3;
  891. }
  892. | aExpr5 NOT_SIMILAR_TO aExpr4
  893. {
  894. $$ = new KDbBinaryExpression(*$1, KDbToken::NOT_SIMILAR_TO, *$3);
  895. delete $1;
  896. delete $3;
  897. }
  898. | aExpr5 BETWEEN aExpr4 AND aExpr4
  899. {
  900. $$ = new KDbNArgExpression(KDb::RelationalExpression, KDbToken::BETWEEN_AND);
  901. $$->toNArg().append( *$1 );
  902. $$->toNArg().append( *$3 );
  903. $$->toNArg().append( *$5 );
  904. delete $1;
  905. delete $3;
  906. delete $5;
  907. }
  908. | aExpr5 NOT_BETWEEN aExpr4 AND aExpr4
  909. {
  910. $$ = new KDbNArgExpression(KDb::RelationalExpression, KDbToken::NOT_BETWEEN_AND);
  911. $$->toNArg().append( *$1 );
  912. $$->toNArg().append( *$3 );
  913. $$->toNArg().append( *$5 );
  914. delete $1;
  915. delete $3;
  916. delete $5;
  917. }
  918. |
  919. aExpr5
  920. ;
  921. /* --- unary logical right --- */
  922. aExpr5:
  923. aExpr5 SQL_IS_NULL
  924. {
  925. $$ = new KDbUnaryExpression( KDbToken::SQL_IS_NULL, *$1 );
  926. delete $1;
  927. }
  928. | aExpr5 SQL_IS_NOT_NULL
  929. {
  930. $$ = new KDbUnaryExpression( KDbToken::SQL_IS_NOT_NULL, *$1 );
  931. delete $1;
  932. }
  933. |
  934. aExpr6
  935. ;
  936. /* arithm. lowest precedence */
  937. aExpr6:
  938. aExpr7 BITWISE_SHIFT_LEFT aExpr6
  939. {
  940. $$ = new KDbBinaryExpression(*$1, KDbToken::BITWISE_SHIFT_LEFT, *$3);
  941. delete $1;
  942. delete $3;
  943. }
  944. | aExpr7 BITWISE_SHIFT_RIGHT aExpr6
  945. {
  946. $$ = new KDbBinaryExpression(*$1, KDbToken::BITWISE_SHIFT_RIGHT, *$3);
  947. delete $1;
  948. delete $3;
  949. }
  950. |
  951. aExpr7
  952. ;
  953. /* arithm. lower precedence */
  954. aExpr7:
  955. aExpr8 '+' aExpr7
  956. {
  957. $$ = new KDbBinaryExpression(*$1, '+', *$3);
  958. delete $1;
  959. delete $3;
  960. }
  961. | aExpr8 CONCATENATION aExpr7
  962. {
  963. $$ = new KDbBinaryExpression(*$1, KDbToken::CONCATENATION, *$3);
  964. delete $1;
  965. delete $3;
  966. }
  967. | aExpr8 '-' %prec UMINUS aExpr7
  968. {
  969. $$ = new KDbBinaryExpression(*$1, '-', *$3);
  970. delete $1;
  971. delete $3;
  972. }
  973. | aExpr8 '&' aExpr7
  974. {
  975. $$ = new KDbBinaryExpression(*$1, '&', *$3);
  976. delete $1;
  977. delete $3;
  978. }
  979. | aExpr8 '|' aExpr7
  980. {
  981. $$ = new KDbBinaryExpression(*$1, '|', *$3);
  982. delete $1;
  983. delete $3;
  984. }
  985. |
  986. aExpr8
  987. ;
  988. /* arithm. higher precedence */
  989. aExpr8:
  990. aExpr9 '/' aExpr8
  991. {
  992. $$ = new KDbBinaryExpression(*$1, '/', *$3);
  993. delete $1;
  994. delete $3;
  995. }
  996. | aExpr9 '*' aExpr8
  997. {
  998. $$ = new KDbBinaryExpression(*$1, '*', *$3);
  999. delete $1;
  1000. delete $3;
  1001. }
  1002. | aExpr9 '%' aExpr8
  1003. {
  1004. $$ = new KDbBinaryExpression(*$1, '%', *$3);
  1005. delete $1;
  1006. delete $3;
  1007. }
  1008. |
  1009. aExpr9
  1010. ;
  1011. /* parenthesis, unary operators, and terminals precedence */
  1012. aExpr9:
  1013. /* --- unary logical left --- */
  1014. '-' aExpr9
  1015. {
  1016. $$ = new KDbUnaryExpression( '-', *$2 );
  1017. delete $2;
  1018. }
  1019. | '+' aExpr9
  1020. {
  1021. $$ = new KDbUnaryExpression( '+', *$2 );
  1022. delete $2;
  1023. }
  1024. | '~' aExpr9
  1025. {
  1026. $$ = new KDbUnaryExpression( '~', *$2 );
  1027. delete $2;
  1028. }
  1029. | NOT aExpr9
  1030. {
  1031. $$ = new KDbUnaryExpression( KDbToken::NOT, *$2 );
  1032. delete $2;
  1033. }
  1034. | IDENTIFIER
  1035. {
  1036. $$ = new KDbVariableExpression( *$1 );
  1037. //! @todo simplify this later if that's 'only one field name' expression
  1038. kdbDebug() << " + identifier: " << *$1;
  1039. delete $1;
  1040. }
  1041. | QUERY_PARAMETER
  1042. {
  1043. $$ = new KDbQueryParameterExpression( *$1 );
  1044. kdbDebug() << " + query parameter:" << *$$;
  1045. delete $1;
  1046. }
  1047. | IDENTIFIER aExprList
  1048. {
  1049. kdbDebug() << " + function:" << *$1 << "(" << *$2 << ")";
  1050. $$ = new KDbFunctionExpression(*$1, *$2);
  1051. delete $1;
  1052. delete $2;
  1053. }
  1054. /*! @todo shall we also support db name? */
  1055. | IDENTIFIER '.' IDENTIFIER
  1056. {
  1057. $$ = new KDbVariableExpression( *$1 + QLatin1Char('.') + *$3 );
  1058. kdbDebug() << " + identifier.identifier:" << *$1 << "." << *$3;
  1059. delete $1;
  1060. delete $3;
  1061. }
  1062. | SQL_NULL
  1063. {
  1064. $$ = new KDbConstExpression( KDbToken::SQL_NULL, QVariant() );
  1065. kdbDebug() << " + NULL";
  1066. // $$ = new KDbField();
  1067. //$$->setName(QString::null);
  1068. }
  1069. | SQL_TRUE
  1070. {
  1071. $$ = new KDbConstExpression( KDbToken::SQL_TRUE, true );
  1072. }
  1073. | SQL_FALSE
  1074. {
  1075. $$ = new KDbConstExpression( KDbToken::SQL_FALSE, false );
  1076. }
  1077. | CHARACTER_STRING_LITERAL
  1078. {
  1079. $$ = new KDbConstExpression( KDbToken::CHARACTER_STRING_LITERAL, *$1 );
  1080. kdbDebug() << " + constant " << $1;
  1081. delete $1;
  1082. }
  1083. | INTEGER_CONST
  1084. {
  1085. QVariant val;
  1086. if ($1 <= INT_MAX && $1 >= INT_MIN)
  1087. val = (int)$1;
  1088. else if ($1 <= UINT_MAX && $1 >= 0)
  1089. val = (uint)$1;
  1090. else if ($1 <= LLONG_MAX && $1 >= LLONG_MIN)
  1091. val = (qint64)$1;
  1092. // if ($1 < ULLONG_MAX)
  1093. // val = (quint64)$1;
  1094. //! @todo ok?
  1095. $$ = new KDbConstExpression( KDbToken::INTEGER_CONST, val );
  1096. kdbDebug() << " + int constant: " << val.toString();
  1097. }
  1098. | REAL_CONST
  1099. {
  1100. $$ = new KDbConstExpression( KDbToken::REAL_CONST, *$1 );
  1101. kdbDebug() << " + real constant: " << *$1;
  1102. delete $1;
  1103. }
  1104. |
  1105. aExpr10
  1106. ;
  1107. aExpr10:
  1108. '(' aExpr ')'
  1109. {
  1110. kdbDebug() << "(expr)";
  1111. $$ = new KDbUnaryExpression('(', *$2);
  1112. delete $2;
  1113. }
  1114. ;
  1115. aExprList:
  1116. '(' aExprList2 ')'
  1117. {
  1118. $$ = $2;
  1119. }
  1120. | '(' ')'
  1121. {
  1122. $$ = new KDbNArgExpression(KDb::ArgumentListExpression, ',');
  1123. }
  1124. ;
  1125. aExprList2:
  1126. aExpr ',' aExprList2
  1127. {
  1128. $$ = $3;
  1129. $$->prepend( *$1 );
  1130. delete $1;
  1131. }
  1132. | aExpr
  1133. {
  1134. $$ = new KDbNArgExpression(KDb::ArgumentListExpression, ',');
  1135. $$->append( *$1 );
  1136. delete $1;
  1137. }
  1138. ;
  1139. Tables:
  1140. FROM FlatTableList
  1141. {
  1142. $$ = $2;
  1143. }
  1144. /*
  1145. | Tables LEFT JOIN IDENTIFIER SQL_ON ColExpression
  1146. {
  1147. kdbDebug() << "LEFT JOIN: '" << *$4 << "' ON " << $6;
  1148. addTable($4->toQString());
  1149. delete $4;
  1150. }
  1151. | Tables LEFT OUTER JOIN IDENTIFIER SQL_ON ColExpression
  1152. {
  1153. kdbDebug() << "LEFT OUTER JOIN: '" << $5 << "' ON " << $7;
  1154. addTable($5);
  1155. }
  1156. | Tables INNER JOIN IDENTIFIER SQL_ON ColExpression
  1157. {
  1158. kdbDebug() << "INNER JOIN: '" << *$4 << "' ON " << $6;
  1159. addTable($4->toQString());
  1160. delete $4;
  1161. }
  1162. | Tables RIGHT JOIN IDENTIFIER SQL_ON ColExpression
  1163. {
  1164. kdbDebug() << "RIGHT JOIN: '" << *$4 << "' ON " << $6;
  1165. addTable(*$4);
  1166. delete $4;
  1167. }
  1168. | Tables RIGHT OUTER JOIN IDENTIFIER SQL_ON ColExpression
  1169. {
  1170. kdbDebug() << "RIGHT OUTER JOIN: '" << *$5 << "' ON " << $7;
  1171. addTable($5->toQString());
  1172. delete $5;
  1173. }*/
  1174. ;
  1175. /*
  1176. FlatTableList:
  1177. aFlatTableList
  1178. {
  1179. $$
  1180. }
  1181. ;*/
  1182. FlatTableList:
  1183. FlatTableList ',' FlatTable
  1184. {
  1185. $$ = $1;
  1186. $$->append(*$3);
  1187. delete $3;
  1188. }
  1189. |FlatTable
  1190. {
  1191. $$ = new KDbNArgExpression(KDb::TableListExpression, KDbToken::IDENTIFIER); //ok?
  1192. $$->append(*$1);
  1193. delete $1;
  1194. }
  1195. ;
  1196. FlatTable:
  1197. IDENTIFIER
  1198. {
  1199. kdbDebug() << "FROM: '" << *$1 << "'";
  1200. $$ = new KDbVariableExpression(*$1);
  1201. //! @todo this isn't ok for more tables:
  1202. /*
  1203. KDbField::ListIterator it = globalParser->query()->fieldsIterator();
  1204. for(KDbField *item; (item = it.current()); ++it)
  1205. {
  1206. if(item->table() == dummy)
  1207. {
  1208. item->setTable(schema);
  1209. }
  1210. if(item->table() && !item->isQueryAsterisk())
  1211. {
  1212. KDbField *f = item->table()->field(item->name());
  1213. if(!f)
  1214. {
  1215. KDbParserError err(KDbParser::tr("Field List Error"), KDbParser::tr("Unknown column '%1' in table '%2'",item->name(),schema->name()), ctoken, current);
  1216. globalParser->setError(err);
  1217. yyerror("fieldlisterror");
  1218. }
  1219. }
  1220. }*/
  1221. delete $1;
  1222. }
  1223. | IDENTIFIER IDENTIFIER
  1224. {
  1225. //table + alias
  1226. $$ = new KDbBinaryExpression(
  1227. KDbVariableExpression(*$1), KDbToken::AS_EMPTY,
  1228. KDbVariableExpression(*$2)
  1229. );
  1230. delete $1;
  1231. delete $2;
  1232. }
  1233. | IDENTIFIER AS IDENTIFIER
  1234. {
  1235. //table + alias
  1236. $$ = new KDbBinaryExpression(
  1237. KDbVariableExpression(*$1), KDbToken::AS,
  1238. KDbVariableExpression(*$3)
  1239. );
  1240. delete $1;
  1241. delete $3;
  1242. }
  1243. ;
  1244. ColViews:
  1245. ColViews ',' ColItem
  1246. {
  1247. $$ = $1;
  1248. $$->append(*$3);
  1249. delete $3;
  1250. kdbDebug() << "ColViews: ColViews , ColItem";
  1251. }
  1252. |ColItem
  1253. {
  1254. $$ = new KDbNArgExpression(KDb::FieldListExpression, KDbToken());
  1255. $$->append(*$1);
  1256. delete $1;
  1257. kdbDebug() << "ColViews: ColItem";
  1258. }
  1259. ;
  1260. ColItem:
  1261. ColExpression
  1262. {
  1263. // $$ = new KDbField();
  1264. // dummy->addField($$);
  1265. // $$->setExpression( $1 );
  1266. // globalParser->query()->addField($$);
  1267. $$ = $1;
  1268. kdbDebug() << " added column expr:" << *$1;
  1269. }
  1270. | ColWildCard
  1271. {
  1272. $$ = $1;
  1273. kdbDebug() << " added column wildcard:" << *$1;
  1274. }
  1275. | ColExpression AS IDENTIFIER
  1276. {
  1277. $$ = new KDbBinaryExpression(
  1278. *$1, KDbToken::AS,
  1279. KDbVariableExpression(*$3)
  1280. );
  1281. kdbDebug() << " added column expr:" << *$$;
  1282. delete $1;
  1283. delete $3;
  1284. }
  1285. | ColExpression IDENTIFIER
  1286. {
  1287. $$ = new KDbBinaryExpression(
  1288. *$1, KDbToken::AS_EMPTY,
  1289. KDbVariableExpression(*$2)
  1290. );
  1291. kdbDebug() << " added column expr:" << *$$;
  1292. delete $1;
  1293. delete $2;
  1294. }
  1295. ;
  1296. ColExpression:
  1297. aExpr
  1298. {
  1299. $$ = $1;
  1300. }
  1301. /* HANDLED BY 'IDENTIFIER aExprList'
  1302. | IDENTIFIER '(' ColViews ')'
  1303. {
  1304. $$ = new KDbFunctionExpression( $1, $3 );
  1305. }*/
  1306. //! @todo
  1307. /*
  1308. | SUM '(' ColExpression ')'
  1309. {
  1310. KDbFunctionExpression(
  1311. // $$ = new AggregationExpression( SUM, );
  1312. // $$->setName("SUM(" + $3->name() + ")");
  1313. //wait $$->containsGroupingAggregate(true);
  1314. //wait globalParser->query()->grouped(true);
  1315. }*/
  1316. //! @todo
  1317. /*
  1318. | SQL_MIN '(' ColExpression ')'
  1319. {
  1320. $$ = $3;
  1321. // $$->setName("MIN(" + $3->name() + ")");
  1322. //wait $$->containsGroupingAggregate(true);
  1323. //wait globalParser->query()->grouped(true);
  1324. }*/
  1325. //! @todo
  1326. /*
  1327. | SQL_MAX '(' ColExpression ')'
  1328. {
  1329. $$ = $3;
  1330. // $$->setName("MAX(" + $3->name() + ")");
  1331. //wait $$->containsGroupingAggregate(true);
  1332. //wait globalParser->query()->grouped(true);
  1333. }*/
  1334. //! @todo
  1335. /*
  1336. | AVG '(' ColExpression ')'
  1337. {
  1338. $$ = $3;
  1339. // $$->setName("AVG(" + $3->name() + ")");
  1340. //wait $$->containsGroupingAggregate(true);
  1341. //wait globalParser->query()->grouped(true);
  1342. }*/
  1343. | DISTINCT '(' ColExpression ')'
  1344. {
  1345. $$ = $3;
  1346. //! @todo DISTINCT '(' ColExpression ')'
  1347. // $$->setName("DISTINCT(" + $3->name() + ")");
  1348. }
  1349. ;
  1350. ColWildCard:
  1351. '*'
  1352. {
  1353. $$ = new KDbVariableExpression(QLatin1String("*"));
  1354. kdbDebug() << "all columns";
  1355. // KDbQueryAsterisk *ast = new KDbQueryAsterisk(globalParser->query(), dummy);
  1356. // globalParser->query()->addAsterisk(ast);
  1357. // requiresTable = true;
  1358. }
  1359. | IDENTIFIER '.' '*'
  1360. {
  1361. QString s( *$1 );
  1362. s += QLatin1String(".*");
  1363. $$ = new KDbVariableExpression(s);
  1364. kdbDebug() << " + all columns from " << s;
  1365. delete $1;
  1366. }
  1367. /*| ERROR_DIGIT_BEFORE_IDENTIFIER
  1368. {
  1369. $$ = new KDbVariableExpression($1);
  1370. kdbDebug() << " Invalid identifier! " << $1;
  1371. setError(KDbParser::tr("Invalid identifier \"%1\"",$1));
  1372. }*/
  1373. ;
  1374. %%