HPCCSQL.g 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998
  1. grammar HPCCSQL;
  2. options
  3. {
  4. language=C;
  5. output=AST;
  6. backtrack=true;
  7. ASTLabelType = pANTLR3_BASE_TREE;
  8. }
  9. tokens
  10. {
  11. TOKEN_ROOT;
  12. TOKEN_SELECT_STATEMENT;
  13. TOKEN_CALL_STATEMENT;
  14. TOKEN_CREATE_LOAD_TABLE_STATEMENT;
  15. TOKEN_CREATE_INDEX_STATEMENT;
  16. TOKEN_CREATE_TABLE;
  17. TOKEN_DONOT_OVERWRITE;
  18. TOKEN_OVERWRITE;
  19. TOKEN_LOAD_TABLE;
  20. TOKEN_FROM_LIST;
  21. TOKEN_FROM_TABLE;
  22. TOKEN_PROC_NAME;
  23. TOKEN_PROC_PARAMS;
  24. TOKEN_ALIAS;
  25. TOKEN_INNER_JOIN;
  26. TOKEN_OUTTER_JOIN;
  27. TOKEN_INDEX_HINT;
  28. TOKEN_AVOID_INDEX;
  29. TOKEN_COLUMN;
  30. TOKEN_LISTEXP;
  31. TOKEN_FUNCEXP;
  32. TOKEN_PARAMPLACEHOLDER;
  33. TOKEN_COLUMNWILDCARD;
  34. TOKEN_TABLE_SCHEMA;
  35. TOKEN_COLUMN_DEF_LIST;
  36. TOKEN_COLUMN_DEF;
  37. TOKEN_LANDING_ZONE;
  38. TOKEN_VARIABLE_FILE;
  39. TOKEN_VAR_SEPERATOR;
  40. TOKEN_VAR_TERMINATOR;
  41. TOKEN_VAR_ENCLOSED;
  42. TOKEN_VAR_ESCAPED;
  43. }
  44. @header
  45. {
  46. }
  47. @members
  48. {
  49. }
  50. @lexer::includes
  51. {
  52. }
  53. @lexer::apifuncs
  54. {
  55. }
  56. @lexer::header
  57. {
  58. }
  59. @lexer::members
  60. {
  61. }
  62. @parser::apifuncs
  63. {
  64. }
  65. fragment Ai : 'a' | 'A';
  66. fragment Bi : 'b' | 'B';
  67. fragment Ci : 'c' | 'C';
  68. fragment Di : 'd' | 'D';
  69. fragment Ei : 'e' | 'E';
  70. fragment Fi : 'f' | 'F';
  71. fragment Gi : 'g' | 'G';
  72. fragment Hi : 'h' | 'H';
  73. fragment Ii : 'i' | 'I';
  74. fragment Ji : 'j' | 'J';
  75. fragment Ki : 'k' | 'K';
  76. fragment Li : 'l' | 'L';
  77. fragment Mi : 'm' | 'M';
  78. fragment Ni : 'n' | 'N';
  79. fragment Oi : 'o' | 'O';
  80. fragment Pi : 'p' | 'P';
  81. fragment Qi : 'q' | 'Q';
  82. fragment Ri : 'r' | 'R';
  83. fragment Si : 's' | 'S';
  84. fragment Ti : 't' | 'T';
  85. fragment Ui : 'u' | 'U';
  86. fragment Vi : 'v' | 'V';
  87. fragment Wi : 'w' | 'W';
  88. fragment Xi : 'x' | 'X';
  89. fragment Yi : 'y' | 'Y';
  90. fragment Zi : 'z' | 'Z';
  91. ADD_SYM : Ai Di Di ;
  92. ALL : Ai Li Li ;
  93. ANY : Ai Ni Yi ;
  94. AS_SYM : Ai Si ;
  95. ASC : Ai Si Ci ;
  96. ASCII_SYM : Ai Si Ii Ii ;
  97. AT_SYM : Ai Ti ;
  98. AVG : Ai Vi Gi ;
  99. BETWEEN : Bi Ei Ti Wi Ei Ei Ni ;
  100. BINARY_SYM : Bi Ii Ni Ai Ri Yi ;
  101. BIT_SYM : Bi Ii Ti ;
  102. BOOL_SYM : Bi Oi Oi Li ;
  103. BOOLEAN_SYM : Bi Oi Oi Li Ei Ai Ni ;
  104. BY_SYM : Bi Yi ;
  105. CALL_SYM : Ci Ai Li Li ;
  106. CREATE_SYM : Ci Ri Ei Ai Ti Ei ;
  107. COLUMN_SYM : Ci Oi Li Ui Mi Ni ;
  108. COMMENT_SYM : Ci Oi Mi Mi Ei Ni Ti ;
  109. CONTAINS_SYM : Ci Oi Ni Ti Ai Ii Ni Si ;
  110. COUNT : Ci Oi Ui Ni Ti ;
  111. DATA_SYM : Di Ai Ti Ai ;
  112. DESC : Di Ei Si Ci ;
  113. DISTINCT : Di Ii Si Ti Ii Ni Ci Ti ;
  114. EXISTS_SYM : Ei Xi Ii Si Ti Si ;
  115. FALSE_SYM : Fi Ai Li Si Ei ;
  116. FOR_SYM : Fi Oi Ri ;
  117. FROM : Fi Ri Oi Mi ;
  118. GROUP_SYM : Gi Ri Oi Ui Pi ;
  119. HAVING : Hi Ai Vi Ii Ni Gi ;
  120. IF_SYM : Ii Fi ;
  121. IGNORE_SYM : Ii Gi Ni Oi Ri Ei ;
  122. IN_SYM : Ii Ni ;
  123. INFILE_SYM : Ii Ni Fi Ii Li Ei ;
  124. INTO_SYM : Ii Ni Ti Oi ;
  125. INT_SYM : Ii Ni Ti ;
  126. INTEGER_SYM : Ii Ni Ti Ei Gi Ei Ri ;
  127. INDEX_SYM : Ii Ni Di Ei Xi ;
  128. INNER_SYM : Ii Ni Ni Ei Ri ;
  129. IS_SYM : Ii Si ;
  130. JOIN_SYM : Ji Oi Ii Ni ;
  131. KEY_SYM : Ki Ei Yi ;
  132. KEYS : Ki Ei Yi Si ;
  133. LAST_SYM : Li Ai Si Ti ;
  134. LEFT : Li Ei Fi Ti ;
  135. LIKE_SYM : Li Ii Ki Ei ;
  136. LIMIT : Li Ii Mi Ii Ti ;
  137. LOAD_SYM : Li Oi Ai Di ;
  138. LOCAL_SYM : Li Oi Ci Ai Li ;
  139. LOWER : (Li Oi Wi Ei Ri) | (Li Ci Ai Si Ei) ;
  140. MAX_SYM : Mi Ai Xi ;
  141. MEDIUMINT : Mi Ei Di Ii Ui Mi Ii Ni Ti ;
  142. MIN_SYM : Mi Ii Ni ;
  143. MOD : Mi Oi Di ;
  144. NOT_SYM : (UNDERSCORE Ni Oi Ti) | (Ni Oi Ti) | ('!') ;
  145. NULL_SYM : Ni Ui Li Li ;
  146. OFFSET_SYM : Oi Fi Fi Si Ei Ti ;
  147. ON : Oi Ni ;
  148. ORDER_SYM : Oi Ri Di Ei Ri ;
  149. OUT_SYM : Oi Ui Ti ;
  150. OUTER : Oi Ui Ti Ei Ri ;
  151. POWER : Pi Oi Wi Ei Ri ;
  152. REPLACE_SYM : Ri Ei Pi Li Ai Ci Ei ;
  153. SELECT : Si Ei Li Ei Ci Ti ;
  154. SMALLINT : Si Mi Ai Li Li Ii Ni Ti ;
  155. SUM : Si Ui Mi ;
  156. TABLE_SYM : Ti Ai Bi Li Ei ;
  157. TINYINT : Ti Ii Ni Yi Ii Ni Ti ;
  158. TRUE_SYM : Ti Ri Ui Ei ;
  159. TYPE_SYM : Ti Yi Pi Ei ;
  160. UPPER : Ui Pi Pi Ei Ri ;
  161. USE_SYM : Ui Si Ei ;
  162. UTF8_SYM : Ui Ti Fi '8' ;
  163. UNSIGNED_SYM : Ui Ni Si Ii Gi Ni Ei Di ;
  164. WHERE : Wi Hi Ei Ri Ei ;
  165. XOR : Xi Oi Ri ;
  166. BIGINT_SYM : Bi Ii Gi Ii Ni Ti ;
  167. REAL_SYM : Ri Ei Ai Li ;
  168. DOUBLE_SYM : Di Oi Ui Bi Li Ei ;
  169. FLOAT_SYM : Fi Li Oi Ai Ti ;
  170. DECIMAL_SYM : Di Ei Ci Ii Mi Ai Li ;
  171. NUMERIC_SYM : Ni Ui Mi Ei Ri Ii Ci ;
  172. DATE_SYM : Di Ai Ti Ei ;
  173. TIME_SYM : Ti Ii Mi Ei ;
  174. TIMESTAMP_SYM : Ti Ii Mi Ei Si Ti Ai Mi Pi ;
  175. DATETIME_SYM : Di Ai Ti Ei Ti Ii Mi Ei ;
  176. YEAR_SYM : Yi Ei Ai Ri ;
  177. CHAR_SYM : Ci Hi Ai Ri ;
  178. VARCHAR_SYM : Vi Ai Ri Ci Hi Ai Ri ;
  179. VARBINARY_SYM : Vi Ai Ri Bi Ii Ni Ai Ri Yi ;
  180. TINYBLOB_SYM : Ti Ii Ni Yi Bi Li Oi Bi ;
  181. BLOB_SYM : Bi Li Oi Bi ;
  182. MEDIUMBLOB_SYM : Mi Ei Di Ii Ui Mi Bi Li Oi Bi ;
  183. LONGBLOB_SYM : Li Oi Ni Gi Bi Li Oi Bi ;
  184. TINYTEXT_SYM : Ti Ii Ni Yi Ti Ei Xi Ti ;
  185. TEXT_SYM : Ti Ei Xi Ti ;
  186. MEDIUMTEXT_SYM : Mi Ei Di Ii Ui Mi Ti Ei Xi Ti ;
  187. LONGTEXT_SYM : Li Oi Ni Gi Ti Ei Xi Ti ;
  188. ENUM_SYM : Ei Ni Ui Mi ;
  189. SET_SYM : Si Ei Ti ;
  190. FLAT_SYM : Fi Li Ai Ti ;
  191. XML_SYM : Xi Mi Li ;
  192. CSV_SYM : Ci Si Vi ;
  193. JSON_SYM : Ji Si Oi Ni ;
  194. CONNECTION_SYM : Ci Oi Ni Ni Ei Ci Ti Ii Oi Ni ;
  195. DIRECTORY_SYM : Di Ii Ri Ei Ci Ti Oi Ri Yi ;
  196. ENCLOSED_SYM : Ei Ni Ci Li Oi Si Ei Di ;
  197. LINES_SYM : Li Ii Ni Ei Si ;
  198. ESCAPED_SYM : Ei Si Ci Ai Pi Ei Di ;
  199. TERMINATED_SYM : Ti Ei Ri Mi Ii Ni Ai Ti Ei Di ;
  200. OPTIONALLY_SYM : Oi Pi Ti Ii Oi Ni Ai Li Li Yi ;
  201. EBCDIC_SYM : Ei Bi Ci Di Ii Ci ;
  202. FIELDS_SYM : Fi Ii Ei Li Di Si ;
  203. COLUMNS_SYM : Ci Oi Li Ui Mi Ni Si ;
  204. CHARACTER_SET : ('CHARACTER SET' | 'character set');
  205. IFNOTEXISTS : ('IF NOT EXISTS' | 'if not exists');
  206. ISNOTNULL : ('IS NOT NULL' | 'is not null');
  207. ISNULL : ('IS NULL' | 'is null');
  208. NOT_IN : ('NOT IN' | 'not in');
  209. NOT_LIKE : ('NOT LIKE' | 'not like');
  210. DIVIDE : ( Di Ii Vi ) | '/' ;
  211. MOD_SYM : ( Mi Oi Di ) | '%' ;
  212. OR_SYM : ( Oi Ri ) | '||';
  213. AND_SYM : ( Ai Ni Di ) | '&&';
  214. ARROW : '=>' ;
  215. EQ_SYM : '=' | '<=>' ;
  216. NOT_EQ : '<>' | '!=' | '~='| '^=';
  217. LET : '<=' ;
  218. GET : '>=' ;
  219. SET_VAR : ':=' ;
  220. SHIFT_LEFT : '<<' ;
  221. SHIFT_RIGHT : '>>' ;
  222. //ALL_FIELDS : '.*' ;
  223. SQUOTE : '\'' ;
  224. //DQUOTE : '\"' ;
  225. DQUOTE : '"' ;
  226. DOLLAR : '$' ;
  227. QUESTION : '?' ;
  228. SEMI : ';' ;
  229. COLON : ':' ;
  230. DOT : '.' ;
  231. COMMA : ',' ;
  232. ASTERISK : '*' ;
  233. RPAREN : ')' ;
  234. LPAREN : '(' ;
  235. RBRACK : ']' ;
  236. LBRACK : '[' ;
  237. LCURLY : '{' ;
  238. RCURLY : '}' ;
  239. PLUS : '+' ;
  240. MINUS : '-' ;
  241. NEGATION : '~' ;
  242. VERTBAR : '|' ;
  243. BITAND : '&' ;
  244. POWER_OP : '^' ;
  245. GTH : '>' ;
  246. LTH : '<' ;
  247. fragment UNDERSCORE : '_' ;
  248. fragment DCOLON : '::' ;
  249. fragment DEFSCOPE : DOT DCOLON ;
  250. fragment LETTER_FRAGMENT
  251. :
  252. ( 'A'..'Z' | 'a'..'z')
  253. ;
  254. INTEGER_NUM
  255. :
  256. DIGIT_FRAGMENT+
  257. ;
  258. fragment DIGIT_FRAGMENT
  259. :
  260. ( '0'..'9')
  261. ;
  262. fragment HEX_DIGIT_FRAGMENT
  263. :
  264. ( 'a'..'f' | 'A'..'F' | DIGIT_FRAGMENT )
  265. ;
  266. HEX_DIGIT
  267. :
  268. ( '0x' (HEX_DIGIT_FRAGMENT)+ )
  269. |
  270. ( 'X' '\'' (HEX_DIGIT_FRAGMENT)+ '\'' )
  271. ;
  272. BIT_NUM
  273. :
  274. ( '0b' ('0'|'1')+ )
  275. |
  276. ( Bi '\'' ('0'|'1')+ '\'' )
  277. ;
  278. REAL_NUMBER
  279. :
  280. ( INTEGER_NUM DOT INTEGER_NUM | INTEGER_NUM DOT | DOT INTEGER_NUM | INTEGER_NUM )
  281. ( (Ei) ( PLUS | MINUS )? INTEGER_NUM )?
  282. ;
  283. TEXT_STRING
  284. :
  285. SQUOTE
  286. (
  287. (SQUOTE SQUOTE)
  288. | ('\\''\'')
  289. | ~('\'')
  290. )*
  291. SQUOTE
  292. ;
  293. quoted_id
  294. :
  295. DQUOTE! ID DQUOTE!
  296. ;
  297. quoted_table_id
  298. :
  299. DQUOTE! (ABSOLUTE_FILE_ID | ID) DQUOTE!
  300. ;
  301. //Cannot rewrite lexer rules see above parser rule
  302. //QUOTED_ID
  303. //:
  304. // DQUOTE! ID DQUOTE!
  305. //;
  306. fragment ABSOLUTE_FILE_ID_PREFIX
  307. :
  308. NEGATION |
  309. DEFSCOPE |
  310. NEGATION DEFSCOPE
  311. ;
  312. ABSOLUTE_FILE_ID
  313. :
  314. ABSOLUTE_FILE_ID_PREFIX ID_FRAGMENT+
  315. ;
  316. ID
  317. :
  318. LETTER_FRAGMENT ( ID_FRAGMENT )*
  319. ;
  320. fragment ID_FRAGMENT
  321. :
  322. LETTER_FRAGMENT | UNDERSCORE | INTEGER_NUM | DCOLON
  323. ;
  324. WHITE_SPACE
  325. :
  326. ( ' '|'\r'|'\t'|'\n' ) {$channel=HIDDEN;}
  327. ;
  328. relational_op
  329. :
  330. EQ_SYM
  331. | LTH
  332. | GTH
  333. | NOT_EQ
  334. | LET
  335. | GET
  336. ;
  337. strcomp_op
  338. :
  339. LIKE_SYM
  340. | NOT_LIKE
  341. ;
  342. list_op
  343. :
  344. IN_SYM
  345. | NOT_IN
  346. ;
  347. string_literal
  348. :
  349. TEXT_STRING
  350. ;
  351. number_literal
  352. :
  353. (PLUS | MINUS)? (INTEGER_NUM | REAL_NUMBER)
  354. ;
  355. hex_literal
  356. :
  357. HEX_DIGIT
  358. ;
  359. boolean_literal
  360. :
  361. TRUE_SYM
  362. | FALSE_SYM
  363. ;
  364. bit_literal
  365. :
  366. BIT_NUM
  367. ;
  368. literal_value
  369. :
  370. (
  371. string_literal
  372. | number_literal
  373. | hex_literal
  374. | boolean_literal
  375. | bit_literal
  376. )
  377. ;
  378. functionList
  379. :
  380. group_functions
  381. | char_functions
  382. ;
  383. char_functions
  384. :
  385. LOWER
  386. | UPPER
  387. ;
  388. group_functions
  389. :
  390. AVG
  391. | COUNT
  392. | MAX_SYM
  393. | MIN_SYM
  394. | SUM
  395. ;
  396. query_set_name : ID ;
  397. schema_name : ID ;
  398. table_name : ABSOLUTE_FILE_ID | ID ;
  399. quoted_table_name : quoted_table_id;
  400. engine_name : ID ;
  401. column_name : ID ;
  402. quoted_column_name : quoted_id ;
  403. index_name : ID ;
  404. user_name : ID ;
  405. function_name : ID ;
  406. procedure_name : ID ;
  407. alias
  408. :
  409. ( AS_SYM )? ID -> ^( TOKEN_ALIAS ID)
  410. | ( AS_SYM )? quoted_id -> ^( TOKEN_ALIAS quoted_id)
  411. ;
  412. column_spec
  413. :
  414. ( quoted_table_name DOT )? quoted_column_name -> ^(TOKEN_COLUMN quoted_column_name quoted_table_name? )
  415. |( table_name DOT )? column_name -> ^(TOKEN_COLUMN column_name table_name? )
  416. ;
  417. expression_list
  418. :
  419. LPAREN expression ( COMMA expression )* RPAREN
  420. ;
  421. expression
  422. :
  423. orExpression
  424. ;
  425. orExpression
  426. :
  427. andExpression
  428. (
  429. OR_SYM^ andExpression
  430. )*
  431. ;
  432. andExpression
  433. :
  434. relationalExpression
  435. (
  436. AND_SYM^ relationalExpression
  437. )*
  438. ;
  439. relationalExpression
  440. :
  441. stringCompExpression
  442. (
  443. relational_op^
  444. stringCompExpression
  445. )*
  446. ;
  447. stringCompExpression
  448. :
  449. additionExpression
  450. (
  451. strcomp_op^
  452. additionExpression
  453. )*
  454. ;
  455. additionExpression
  456. :
  457. multiplyExpression
  458. (
  459. (PLUS|MINUS)^ multiplyExpression
  460. )?
  461. ;
  462. multiplyExpression
  463. :
  464. listExpression
  465. (
  466. (ASTERISK
  467. |DIVIDE
  468. |MOD_SYM
  469. |POWER_OP)^
  470. listExpression
  471. )?
  472. ;
  473. listExpression
  474. :
  475. unaryExpression
  476. (
  477. list_op^
  478. literalOrPlaceholderExpressionList
  479. )?
  480. ;
  481. unaryExpression
  482. :
  483. (NEGATION | NOT_SYM )^ simpleExpression
  484. |
  485. simpleExpression (ISNOTNULL | ISNULL)^
  486. |
  487. simpleExpression
  488. ;
  489. simpleExpression
  490. :
  491. column_spec
  492. | literal_value
  493. | function_call
  494. | parenExpression
  495. | parameterPlaceHolder
  496. | literalExpressionList
  497. ;
  498. parenExpression
  499. :
  500. LPAREN^ orExpression RPAREN!
  501. ;
  502. literalExpressionList
  503. :
  504. LPAREN literal_value( COMMA literal_value )* RPAREN -> {$COMMA != NULL}? ^(TOKEN_LISTEXP literal_value+)
  505. -> ^(TOKEN_LISTEXP literal_value)
  506. ;
  507. literalOrPlaceholderExpressionList
  508. :
  509. LPAREN literalOrPlaceholderValue( COMMA literalOrPlaceholderValue )* RPAREN -> {$COMMA != NULL}? ^(TOKEN_LISTEXP literalOrPlaceholderValue+)
  510. -> ^(TOKEN_LISTEXP literalOrPlaceholderValue)
  511. ;
  512. literalOrPlaceholderValue
  513. :
  514. literal_value | parameterPlaceHolder
  515. ;
  516. function_call
  517. :
  518. (
  519. functionList ( LPAREN (functionParam (COMMA functionParam)*)? RPAREN ) ?
  520. ) -> {$COMMA != NULL}? ^(TOKEN_FUNCEXP functionList functionParam+)
  521. -> ^(TOKEN_FUNCEXP functionList functionParam)
  522. ;
  523. functionParam
  524. :
  525. (DISTINCT)?
  526. (
  527. literal_value
  528. | column_spec
  529. | parameterPlaceHolder
  530. | ASTERISK
  531. )
  532. ;
  533. parameterPlaceHolder
  534. :
  535. (
  536. QUESTION
  537. | DOLLAR LCURLY ID? RCURLY
  538. | userVariable
  539. )
  540. -> ^(TOKEN_PARAMPLACEHOLDER)
  541. ;
  542. userVariable
  543. :
  544. '@' ID
  545. ;
  546. table_references
  547. :
  548. table_reference ( COMMA! table_reference )*
  549. ;
  550. table_reference
  551. :
  552. table_atom |
  553. table_atom (jointable)+
  554. ;
  555. table_list:
  556. table_atom ( COMMA! table_atom )*
  557. ;
  558. jointable
  559. :
  560. INNER_SYM JOIN_SYM table_atom join_condition -> ^( TOKEN_INNER_JOIN table_atom join_condition )
  561. | OUTER JOIN_SYM table_atom join_condition -> ^( TOKEN_OUTTER_JOIN table_atom join_condition )
  562. ;
  563. table_factor1
  564. :
  565. table_factor2 ( INNER_SYM JOIN_SYM table_atom join_condition )?
  566. -> {$JOIN_SYM != NULL}? ^( table_factor2 TOKEN_INNER_JOIN table_atom join_condition )
  567. -> table_factor2
  568. ;
  569. table_factor2
  570. :
  571. table_factor3 ( OUTER JOIN_SYM table_atom join_condition)?
  572. -> {$JOIN_SYM != NULL}? ^( table_factor3 TOKEN_OUTTER_JOIN table_atom join_condition )
  573. -> table_atom
  574. ;
  575. table_factor3
  576. :
  577. table_atom
  578. ;
  579. table_atom
  580. :
  581. table_spec^ (alias)? (index_hint)?
  582. ;
  583. join_condition
  584. :
  585. ON^ expression
  586. ;
  587. index_hint
  588. :
  589. USE_SYM INDEX_SYM LPAREN ( index_name | u = 'NONE' | l = 'none') RPAREN -> {$u != NULL}? ^(TOKEN_AVOID_INDEX index_name)
  590. -> {$l != NULL}? ^(TOKEN_AVOID_INDEX index_name)
  591. -> ^(TOKEN_INDEX_HINT index_name)
  592. ;
  593. root_statement
  594. @init
  595. {
  596. }
  597. :
  598. ( data_manipulation_statements)(SEMI)? -> ^(TOKEN_ROOT data_manipulation_statements)
  599. ;
  600. data_manipulation_statements
  601. :
  602. select_statement -> ^( TOKEN_SELECT_STATEMENT select_statement)
  603. | call_statement -> ^( TOKEN_CALL_STATEMENT call_statement)
  604. | create_load_table_statement -> ^( TOKEN_CREATE_LOAD_TABLE_STATEMENT create_load_table_statement)
  605. //| create_index_statement -> ^( TOKEN_CREATE_INDEX_STATEMENT create_index_statement)
  606. ;
  607. create_index_statement
  608. :
  609. CREATE_SYM INDEX_SYM index_name ON table_spec column_list
  610. ;
  611. create_load_table_statement
  612. :
  613. create_table_statement
  614. (SEMI?)!
  615. load_table_statement
  616. -> create_table_statement load_table_statement
  617. ;
  618. table_options
  619. :
  620. table_option (( COMMA )? table_option)*
  621. ;
  622. table_option:
  623. ( COMMENT_SYM^ (EQ_SYM?)! string_literal )
  624. ;
  625. create_table_statement
  626. :
  627. CREATE_SYM TABLE_SYM noov=IFNOTEXISTS? table_name create_table_columns_definition
  628. (table_options)?
  629. -> {$noov != NULL}? ^( TOKEN_CREATE_TABLE table_name TOKEN_DONOT_OVERWRITE table_options? create_table_columns_definition)
  630. -> ^( TOKEN_CREATE_TABLE table_name TOKEN_OVERWRITE table_options? create_table_columns_definition)
  631. ;
  632. create_table_columns_definition
  633. :
  634. LPAREN create_definition (COMMA create_definition)* RPAREN -> {$COMMA != NULL}? ^(TOKEN_COLUMN_DEF_LIST create_definition+)
  635. -> ^(TOKEN_COLUMN_DEF_LIST create_definition)
  636. ;
  637. create_definition
  638. :
  639. column_name column_definition -> ^(TOKEN_COLUMN_DEF column_name column_definition)
  640. ;
  641. length_and_or_precision_definition
  642. :
  643. LPAREN length ( COMMA number_literal)? RPAREN -> ^(length number_literal?)
  644. ;
  645. length_and_precision_definition
  646. :
  647. LPAREN length COMMA number_literal RPAREN -> ^(length number_literal)
  648. ;
  649. length_definition
  650. :
  651. LPAREN length RPAREN -> ^(length)
  652. ;
  653. text_params
  654. :
  655. LPAREN string_literal (COMMA string_literal)* RPAREN -> ^( TOKEN_PROC_PARAMS string_literal+ )
  656. ;
  657. column_definition
  658. :
  659. BIT_SYM length_definition? -> ^(BIT_SYM)
  660. | TINYINT length_definition? UNSIGNED_SYM? -> ^(TINYINT UNSIGNED_SYM? length_definition?)
  661. | SMALLINT length_definition? UNSIGNED_SYM? -> ^(SMALLINT UNSIGNED_SYM? length_definition?)
  662. | MEDIUMINT length_definition? UNSIGNED_SYM? -> ^(MEDIUMINT UNSIGNED_SYM? length_definition?)
  663. | INT_SYM length_definition? UNSIGNED_SYM? -> ^(INTEGER_SYM UNSIGNED_SYM? length_definition?)
  664. | INTEGER_SYM length_definition? UNSIGNED_SYM? -> ^(INTEGER_SYM UNSIGNED_SYM? length_definition?)
  665. | BIGINT_SYM length_definition? UNSIGNED_SYM? -> ^(BIGINT_SYM UNSIGNED_SYM? length_definition?)
  666. | REAL_SYM length_and_precision_definition? UNSIGNED_SYM? -> ^(REAL_SYM UNSIGNED_SYM? length_and_precision_definition?)
  667. | DOUBLE_SYM length_and_precision_definition? UNSIGNED_SYM? -> ^(DOUBLE_SYM UNSIGNED_SYM? length_and_precision_definition?)
  668. | FLOAT_SYM length_and_precision_definition? UNSIGNED_SYM? -> ^(FLOAT_SYM UNSIGNED_SYM? length_and_precision_definition?)
  669. | DECIMAL_SYM length_and_or_precision_definition? UNSIGNED_SYM? -> ^(DECIMAL_SYM UNSIGNED_SYM? length_and_or_precision_definition?)
  670. | NUMERIC_SYM length_and_or_precision_definition? UNSIGNED_SYM? -> ^(NUMERIC_SYM UNSIGNED_SYM? length_and_or_precision_definition?)
  671. | DATE_SYM
  672. | TIME_SYM
  673. | TIMESTAMP_SYM
  674. | DATETIME_SYM
  675. | YEAR_SYM
  676. | CHAR_SYM length_definition? charset_declaration? -> ^(CHAR_SYM length_definition? charset_declaration?)
  677. | VARCHAR_SYM length_definition charset_declaration? -> ^(VARCHAR_SYM length_definition charset_declaration?)
  678. | BINARY_SYM length_definition? -> ^(BINARY_SYM length_definition?)
  679. | VARBINARY_SYM length_definition -> ^(VARBINARY_SYM length_definition)
  680. | TINYBLOB_SYM
  681. | BLOB_SYM
  682. | MEDIUMBLOB_SYM
  683. | LONGBLOB_SYM
  684. | TINYTEXT_SYM BINARY_SYM? -> ^(TINYTEXT_SYM BINARY_SYM?)
  685. | TEXT_SYM BINARY_SYM? charset_declaration? -> ^(TEXT_SYM BINARY_SYM? charset_declaration?)
  686. | MEDIUMTEXT_SYM BINARY_SYM? charset_declaration? -> ^(MEDIUMTEXT_SYM BINARY_SYM? charset_declaration?)
  687. | LONGTEXT_SYM BINARY_SYM? charset_declaration? -> ^(LONGTEXT_SYM BINARY_SYM? charset_declaration?)
  688. | ENUM_SYM text_params charset_declaration? -> ^(ENUM_SYM text_params charset_declaration?)
  689. | SET_SYM text_params charset_declaration? -> ^(SET_SYM text_params charset_declaration?)
  690. ;
  691. charset_declaration
  692. :
  693. CHARACTER_SET^ charset_name
  694. ;
  695. charset_name
  696. :
  697. ASCII_SYM
  698. | UTF8_SYM
  699. ;
  700. file_data_format_type_options
  701. :
  702. LPAREN! (ID EQ_SYM! string_literal) (COMMA! (ID EQ_SYM! string_literal))* RPAREN!
  703. ;
  704. file_data_format_type
  705. :
  706. FLAT_SYM
  707. | XML_SYM
  708. | CSV_SYM
  709. | JSON_SYM
  710. ;
  711. file_data_format_declaration
  712. :
  713. TYPE_SYM file_data_format_type file_data_format_type_options? -> ^(TYPE_SYM file_data_format_type file_data_format_type_options?)
  714. ;
  715. variable_data_line_terminator
  716. :
  717. TERMINATED_SYM BY_SYM t=TEXT_STRING -> ^(TOKEN_VAR_TERMINATOR $t)
  718. ;
  719. variable_data_field_terminator
  720. :
  721. TERMINATED_SYM BY_SYM t=TEXT_STRING -> ^(TOKEN_VAR_SEPERATOR $t)
  722. ;
  723. variable_data_escaped
  724. :
  725. ESCAPED_SYM BY_SYM t=TEXT_STRING -> ^(TOKEN_VAR_ESCAPED $t)
  726. ;
  727. variable_data_enclosed
  728. :
  729. (OPTIONALLY_SYM)? ENCLOSED_SYM BY_SYM t=TEXT_STRING -> ^(TOKEN_VAR_ENCLOSED $t)
  730. ;
  731. variable_data_format_declaration_field
  732. :
  733. (FIELDS_SYM | COLUMNS_SYM)
  734. variable_data_field_terminator?
  735. variable_data_enclosed?
  736. variable_data_escaped?
  737. -> ^(TOKEN_VARIABLE_FILE variable_data_field_terminator? variable_data_enclosed? variable_data_escaped?)
  738. ;
  739. variable_data_format_declaration_line
  740. :
  741. LINES_SYM
  742. //(STARTING BY_SYM TEXT_STRING)?
  743. variable_data_line_terminator?
  744. -> ^(TOKEN_VARIABLE_FILE variable_data_line_terminator?)
  745. ;
  746. landing_zone_information
  747. :
  748. CONNECTION_SYM EQ_SYM? conn=string_literal
  749. DIRECTORY_SYM EQ_SYM? dir=string_literal
  750. -> ^(TOKEN_LANDING_ZONE $conn $dir)
  751. ;
  752. load_table_statement
  753. :
  754. LOAD_SYM DATA_SYM
  755. landing_zone_information?
  756. INFILE_SYM ff=string_literal landing_zone_information? file_data_format_declaration?
  757. INTO_SYM TABLE_SYM table_spec
  758. variable_data_format_declaration_field?
  759. variable_data_format_declaration_line?
  760. -> ^( TOKEN_LOAD_TABLE table_spec $ff landing_zone_information? file_data_format_declaration? variable_data_format_declaration_field? variable_data_format_declaration_line?)
  761. ;
  762. select_statement
  763. :
  764. select_portion
  765. ( from_portion
  766. ( where_clause )?
  767. ( groupby_clause )?
  768. ( having_clause )?
  769. )?
  770. ( orderby_clause )?
  771. ( limit_clause )?
  772. ;
  773. select_portion
  774. :
  775. SELECT^ ( DISTINCT )? select_list
  776. ;
  777. from_portion
  778. :
  779. FROM^ table_references
  780. ;
  781. where_clause
  782. :
  783. WHERE^ expression
  784. ;
  785. groupby_clause
  786. :
  787. GROUP_SYM^ BY_SYM! column_spec (COMMA! column_spec)*
  788. ;
  789. having_clause
  790. :
  791. HAVING^ expression
  792. ;
  793. orderby_clause
  794. :
  795. ORDER_SYM^ BY_SYM! orderby_item (COMMA! orderby_item)*
  796. ;
  797. orderby_item
  798. :
  799. column_spec^ (ASC! | DESC)?
  800. ;
  801. limit_clause
  802. :
  803. LIMIT^ row_count (OFFSET_SYM! offset)?
  804. ;
  805. length
  806. :
  807. INTEGER_NUM
  808. ;
  809. offset
  810. :
  811. INTEGER_NUM
  812. ;
  813. row_count
  814. :
  815. INTEGER_NUM;
  816. select_list
  817. :
  818. select_item
  819. (COMMA! select_item)*
  820. ;
  821. select_item
  822. :
  823. column_spec^ (alias)?
  824. | string_literal^ (alias)?
  825. | number_literal^ (alias)?
  826. | hex_literal^ (alias)?
  827. | boolean_literal^ (alias)?
  828. | function_call^ (alias)?
  829. | column_wildcard
  830. ;
  831. column_list
  832. :
  833. LPAREN column_spec (COMMA column_spec)* RPAREN
  834. ;
  835. subquery
  836. :
  837. LPAREN select_statement RPAREN
  838. ;
  839. table_spec
  840. :
  841. schema_spec? table_fork -> ^(table_fork schema_spec?)
  842. ;
  843. table_fork
  844. :
  845. (table_name | quoted_table_name)^
  846. ;
  847. schema_spec
  848. :
  849. (ID|quoted_id) DOT -> ^(TOKEN_TABLE_SCHEMA ID? quoted_id?)
  850. ;
  851. column_wildcard
  852. :
  853. (ID DOT)? ASTERISK -> ^(TOKEN_COLUMNWILDCARD ID?)
  854. ;
  855. callParam
  856. :
  857. string_literal
  858. | number_literal
  859. | hex_literal
  860. | boolean_literal
  861. | parameterPlaceHolder
  862. ;
  863. call_procedure_name_part
  864. :
  865. (query_set_name DOT)? procedure_name -> ^( TOKEN_PROC_NAME procedure_name query_set_name? )
  866. ;
  867. call_procedure_params
  868. :
  869. callParam ( COMMA callParam)* -> ^( TOKEN_PROC_PARAMS callParam+ )
  870. ;
  871. call_statement
  872. :
  873. CALL_SYM! call_procedure_name_part LPAREN! call_procedure_params? RPAREN!
  874. ;