1 /* 2 * Copyright (C) 2025 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 %name PerfettoSqlParse 18 %token_prefix TK_ 19 %start_symbol input 20 21 %include { 22 #include <stdio.h> 23 #include <stddef.h> 24 #include "src/trace_processor/perfetto_sql/grammar/perfettosql_grammar_interface.h" 25 26 #define YYNOERRORRECOVERY 1 27 #define YYPARSEFREENEVERNULL 1 28 } 29 30 %token CREATE REPLACE PERFETTO MACRO INCLUDE MODULE RETURNS FUNCTION. 31 32 %left OR. 33 %left AND. 34 %right NOT. 35 %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. 36 %left GT LE LT GE. 37 %right ESCAPE. 38 %left BITAND BITOR LSHIFT RSHIFT. 39 %left PLUS MINUS. 40 %left STAR SLASH REM. 41 %left CONCAT PTR. 42 %left COLLATE. 43 %right BITNOT. 44 %nonassoc ON. 45 46 %fallback 47 // Taken from SQLite 48 ID 49 ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW 50 CONFLICT DATABASE DEFERRED DESC DETACH DO 51 EACH END EXCLUSIVE EXPLAIN FAIL FOR 52 IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN 53 QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW ROWS 54 ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT 55 NULLS FIRST LAST 56 CURRENT FOLLOWING PARTITION PRECEDING RANGE UNBOUNDED 57 EXCLUDE GROUPS OTHERS TIES 58 GENERATED ALWAYS 59 MATERIALIZED 60 REINDEX RENAME CTIME_KW IF 61 // Our additions. 62 FUNCTION MODULE PERFETTO 63 . 64 %wildcard ANY. 65 66 %token_type {struct PerfettoSqlToken} 67 68 %extra_context {struct PerfettoSqlParserState* state} 69 %syntax_error { 70 OnPerfettoSqlSyntaxError(state, &yyminor); 71 } 72 73 // Helper function like scantok but usable by us. 74 pscantok(A) ::= . { 75 assert( yyLookahead!=YYNOCODE ); 76 A = yyLookaheadToken; 77 } 78 79 // Shared rules 80 %type sql_argument_list { struct PerfettoSqlArgumentList* } 81 %destructor sql_argument_list { OnPerfettoSqlFreeArgumentList(state, $$); } 82 sql_argument_list(A) ::=. { A = 0; } 83 sql_argument_list(A) ::= sql_argument_list_nonempty(X). { A = X; } 84 85 sql_argument_type(A) ::= ID(B). { A = B; } 86 sql_argument_type(A) ::= ID(B) LP ID DOT ID RP. { A = B; } 87 88 %type sql_argument_list_nonempty { struct PerfettoSqlArgumentList* } 89 %destructor sql_argument_list_nonempty { OnPerfettoSqlFreeArgumentList(state, $$); } 90 sql_argument_list_nonempty(A) ::= sql_argument_list_nonempty(B) COMMA ID(C) sql_argument_type(D). { 91 A = OnPerfettoSqlCreateOrAppendArgument(state, B, &C, &D); 92 } 93 sql_argument_list_nonempty(A) ::= ID(B) sql_argument_type(C). { 94 A = OnPerfettoSqlCreateOrAppendArgument(state, 0, &B, &C); 95 } 96 97 %type table_schema { struct PerfettoSqlArgumentList* } 98 %destructor table_schema { OnPerfettoSqlFreeArgumentList(state, $$); } 99 table_schema(A) ::=. { A = 0; } 100 table_schema(A) ::= LP sql_argument_list_nonempty(B) RP. { A = B; } 101 102 // CREATE statements 103 %type or_replace {int} 104 or_replace(A) ::=. { A = 0; } 105 or_replace(A) ::= OR REPLACE. { A = 1; } 106 107 // CREATE PERFETTO FUNCTION 108 cmd ::= CREATE or_replace(R) PERFETTO FUNCTION ID(N) LP sql_argument_list(A) RP RETURNS return_type(T) AS select(E) pscantok(S). { 109 OnPerfettoSqlCreateFunction(state, R, &N, A, T, &E, &S); 110 } 111 112 %type return_type { struct PerfettoSqlFnReturnType* } 113 %destructor return_type { OnPerfettoSqlFnFreeReturnType(state, $$); } 114 return_type(Y) ::= ID(X). { 115 Y = OnPerfettoSqlCreateScalarReturnType(&X); 116 } 117 return_type(Y) ::= TABLE LP sql_argument_list_nonempty(A) RP. { 118 Y = OnPerfettoSqlCreateTableReturnType(A); 119 } 120 121 // CREATE PERFETTO TABLE 122 cmd ::= CREATE or_replace(R) PERFETTO TABLE ID(N) table_schema(S) AS select(A) pscantok(Q). { 123 OnPerfettoSqlCreateTable(state, R, &N, S, &A, &Q); 124 } 125 126 // CREATE PERFETTO VIEW 127 cmd ::= CREATE(C) or_replace(R) PERFETTO VIEW ID(N) table_schema(S) AS select(A) pscantok(Q). { 128 OnPerfettoSqlCreateView(state, R, &C, &N, S, &A, &Q); 129 } 130 131 // CREATE PERFETTO INDEX 132 cmd ::= CREATE(C) or_replace(R) PERFETTO INDEX ID(N) ON ID(T) LP indexed_column_list(L) RP. { 133 OnPerfettoSqlCreateIndex(state, R, &C, &N, &T, L); 134 } 135 136 %type indexed_column_list { struct PerfettoSqlIndexedColumnList* } 137 %destructor indexed_column_list { OnPerfettoSqlFreeIndexedColumnList(state, $$); } 138 indexed_column_list(A) ::= indexed_column_list(B) COMMA ID(C). { 139 A = OnPerfettoSqlCreateOrAppendIndexedColumn(B, &C); 140 } 141 indexed_column_list(A) ::= ID(B). { 142 A = OnPerfettoSqlCreateOrAppendIndexedColumn(0, &B); 143 } 144 145 // CREATE PERFETTO MACRO 146 cmd ::= CREATE or_replace(R) PERFETTO MACRO ID(N) LP macro_argument_list(A) RP RETURNS ID(T) AS macro_body(S) pscantok(B). { 147 OnPerfettoSqlCreateMacro(state, R, &N, A, &T, &S, &B); 148 } 149 macro_body ::= ANY. 150 macro_body ::= macro_body ANY. 151 152 %type macro_argument_list_nonempty { struct PerfettoSqlMacroArgumentList* } 153 %destructor macro_argument_list_nonempty { OnPerfettoSqlFreeMacroArgumentList(state, $$); } 154 macro_argument_list_nonempty(A) ::= macro_argument_list_nonempty(D) COMMA ID(B) ID(C). { 155 A = OnPerfettoSqlCreateOrAppendMacroArgument(state, D, &B, &C); 156 } 157 macro_argument_list_nonempty(A) ::= ID(B) ID(C). { 158 A = OnPerfettoSqlCreateOrAppendMacroArgument(state, 0, &B, &C); 159 } 160 161 %type macro_argument_list { struct PerfettoSqlMacroArgumentList* } 162 %destructor macro_argument_list { OnPerfettoSqlFreeMacroArgumentList(state, $$); } 163 macro_argument_list(A) ::=. { A = 0; } 164 macro_argument_list(A) ::= macro_argument_list_nonempty(B). { A = B; } 165 166 // INCLUDE statement 167 cmd ::= INCLUDE PERFETTO MODULE module_name(M). { 168 OnPerfettoSqlInclude(state, &M); 169 } 170 module_name(A) ::= ID|STAR|INTERSECT(B). { 171 A = B; 172 } 173 module_name(A) ::= module_name(B) DOT ID|STAR|INTERSECT(C). { 174 A = (struct PerfettoSqlToken) {B.ptr, C.ptr + C.n - B.ptr}; 175 } 176 177 // DROP statement 178 cmd ::= DROP PERFETTO INDEX ID(N) ON ID(T). { 179 OnPerfettoSqlDropIndex(state, &N, &T); 180 } 181 // Reprint of input file "buildtools/sqlite_src/src/parse.y". 182 // Symbols: 183 // 0 $ 160 ELSE 184 // 1 SEMI 161 INDEX 185 // 2 EXPLAIN 162 ALTER 186 // 3 QUERY 163 ADD 187 // 4 PLAN 164 WINDOW 188 // 5 BEGIN 165 OVER 189 // 6 TRANSACTION 166 FILTER 190 // 7 DEFERRED 167 COLUMN 191 // 8 IMMEDIATE 168 AGG_FUNCTION 192 // 9 EXCLUSIVE 169 AGG_COLUMN 193 // 10 COMMIT 170 TRUEFALSE 194 // 11 END 171 ISNOT 195 // 12 ROLLBACK 172 FUNCTION 196 // 13 SAVEPOINT 173 UMINUS 197 // 14 RELEASE 174 UPLUS 198 // 15 TO 175 TRUTH 199 // 16 TABLE 176 REGISTER 200 // 17 CREATE 177 VECTOR 201 // 18 IF 178 SELECT_COLUMN 202 // 19 NOT 179 IF_NULL_ROW 203 // 20 EXISTS 180 ASTERISK 204 // 21 TEMP 181 SPAN 205 // 22 LP 182 ERROR 206 // 23 RP 183 SPACE 207 // 24 AS 184 ILLEGAL 208 // 25 COMMA 185 input 209 // 26 WITHOUT 186 cmdlist 210 // 27 ABORT 187 ecmd 211 // 28 ACTION 188 cmdx 212 // 29 AFTER 189 explain 213 // 30 ANALYZE 190 cmd 214 // 31 ASC 191 transtype 215 // 32 ATTACH 192 trans_opt 216 // 33 BEFORE 193 nm 217 // 34 BY 194 savepoint_opt 218 // 35 CASCADE 195 create_table 219 // 36 CAST 196 create_table_args 220 // 37 CONFLICT 197 createkw 221 // 38 DATABASE 198 temp 222 // 39 DESC 199 ifnotexists 223 // 40 DETACH 200 dbnm 224 // 41 EACH 201 columnlist 225 // 42 FAIL 202 conslist_opt 226 // 43 OR 203 table_option_set 227 // 44 AND 204 select 228 // 45 IS 205 table_option 229 // 46 MATCH 206 columnname 230 // 47 LIKE_KW 207 carglist 231 // 48 BETWEEN 208 typetoken 232 // 49 IN 209 typename 233 // 50 ISNULL 210 signed 234 // 51 NOTNULL 211 plus_num 235 // 52 NE 212 minus_num 236 // 53 EQ 213 scanpt 237 // 54 GT 214 scantok 238 // 55 LE 215 ccons 239 // 56 LT 216 term 240 // 57 GE 217 expr 241 // 58 ESCAPE 218 onconf 242 // 59 ID 219 sortorder 243 // 60 COLUMNKW 220 autoinc 244 // 61 DO 221 eidlist_opt 245 // 62 FOR 222 refargs 246 // 63 IGNORE 223 defer_subclause 247 // 64 INITIALLY 224 generated 248 // 65 INSTEAD 225 refarg 249 // 66 NO 226 refact 250 // 67 KEY 227 init_deferred_pred_opt 251 // 68 OF 228 conslist 252 // 69 OFFSET 229 tconscomma 253 // 70 PRAGMA 230 tcons 254 // 71 RAISE 231 sortlist 255 // 72 RECURSIVE 232 eidlist 256 // 73 REPLACE 233 defer_subclause_opt 257 // 74 RESTRICT 234 orconf 258 // 75 ROW 235 resolvetype 259 // 76 ROWS 236 raisetype 260 // 77 TRIGGER 237 ifexists 261 // 78 VACUUM 238 fullname 262 // 79 VIEW 239 selectnowith 263 // 80 VIRTUAL 240 oneselect 264 // 81 WITH 241 wqlist 265 // 82 NULLS 242 multiselect_op 266 // 83 FIRST 243 distinct 267 // 84 LAST 244 selcollist 268 // 85 CURRENT 245 from 269 // 86 FOLLOWING 246 where_opt 270 // 87 PARTITION 247 groupby_opt 271 // 88 PRECEDING 248 having_opt 272 // 89 RANGE 249 orderby_opt 273 // 90 UNBOUNDED 250 limit_opt 274 // 91 EXCLUDE 251 window_clause 275 // 92 GROUPS 252 values 276 // 93 OTHERS 253 nexprlist 277 // 94 TIES 254 sclp 278 // 95 GENERATED 255 as 279 // 96 ALWAYS 256 seltablist 280 // 97 MATERIALIZED 257 stl_prefix 281 // 98 REINDEX 258 joinop 282 // 99 RENAME 259 on_using 283 // 100 CTIME_KW 260 indexed_by 284 // 101 ANY 261 exprlist 285 // 102 BITAND 262 xfullname 286 // 103 BITOR 263 idlist 287 // 104 LSHIFT 264 indexed_opt 288 // 105 RSHIFT 265 nulls 289 // 106 PLUS 266 with 290 // 107 MINUS 267 where_opt_ret 291 // 108 STAR 268 setlist 292 // 109 SLASH 269 insert_cmd 293 // 110 REM 270 idlist_opt 294 // 111 CONCAT 271 upsert 295 // 112 PTR 272 returning 296 // 113 COLLATE 273 filter_over 297 // 114 BITNOT 274 likeop 298 // 115 ON 275 between_op 299 // 116 INDEXED 276 in_op 300 // 117 STRING 277 paren_exprlist 301 // 118 JOIN_KW 278 case_operand 302 // 119 CONSTRAINT 279 case_exprlist 303 // 120 DEFAULT 280 case_else 304 // 121 NULL 281 uniqueflag 305 // 122 PRIMARY 282 collate 306 // 123 UNIQUE 283 vinto 307 // 124 CHECK 284 nmnum 308 // 125 REFERENCES 285 trigger_decl 309 // 126 AUTOINCR 286 trigger_cmd_list 310 // 127 INSERT 287 trigger_time 311 // 128 DELETE 288 trigger_event 312 // 129 UPDATE 289 foreach_clause 313 // 130 SET 290 when_clause 314 // 131 DEFERRABLE 291 trigger_cmd 315 // 132 FOREIGN 292 trnm 316 // 133 DROP 293 tridxby 317 // 134 UNION 294 database_kw_opt 318 // 135 ALL 295 key_opt 319 // 136 EXCEPT 296 add_column_fullname 320 // 137 INTERSECT 297 kwcolumn_opt 321 // 138 SELECT 298 create_vtab 322 // 139 VALUES 299 vtabarglist 323 // 140 DISTINCT 300 vtabarg 324 // 141 DOT 301 vtabargtoken 325 // 142 FROM 302 lp 326 // 143 JOIN 303 anylist 327 // 144 USING 304 wqitem 328 // 145 ORDER 305 wqas 329 // 146 GROUP 306 windowdefn_list 330 // 147 HAVING 307 windowdefn 331 // 148 LIMIT 308 window 332 // 149 WHERE 309 frame_opt 333 // 150 RETURNING 310 part_opt 334 // 151 INTO 311 filter_clause 335 // 152 NOTHING 312 over_clause 336 // 153 FLOAT 313 range_or_rows 337 // 154 BLOB 314 frame_bound 338 // 155 INTEGER 315 frame_bound_s 339 // 156 VARIABLE 316 frame_bound_e 340 // 157 CASE 317 frame_exclude_opt 341 // 158 WHEN 318 frame_exclude 342 // 159 THEN 343 explain ::= EXPLAIN. 344 explain ::= EXPLAIN QUERY PLAN. 345 cmdx ::= cmd. 346 cmd ::= BEGIN transtype trans_opt. 347 transtype ::=. 348 transtype ::= DEFERRED. 349 transtype ::= IMMEDIATE. 350 transtype ::= EXCLUSIVE. 351 cmd ::= COMMIT|END trans_opt. 352 cmd ::= ROLLBACK trans_opt. 353 cmd ::= SAVEPOINT nm. 354 cmd ::= RELEASE savepoint_opt nm. 355 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm. 356 create_table ::= createkw temp TABLE ifnotexists nm dbnm. 357 createkw ::= CREATE. 358 ifnotexists ::=. 359 ifnotexists ::= IF NOT EXISTS. 360 temp ::= TEMP. 361 temp ::=. 362 create_table_args ::= LP columnlist conslist_opt RP table_option_set. 363 create_table_args ::= AS select. 364 table_option_set ::=. 365 table_option_set ::= table_option_set COMMA table_option. 366 table_option ::= WITHOUT nm. 367 table_option ::= nm. 368 columnname ::= nm typetoken. 369 typetoken ::=. 370 typetoken ::= typename LP signed RP. 371 typetoken ::= typename LP signed COMMA signed RP. 372 typename ::= typename ID|STRING. 373 scanpt ::=. 374 scantok ::=. 375 ccons ::= CONSTRAINT nm. 376 ccons ::= DEFAULT scantok term. 377 ccons ::= DEFAULT LP expr RP. 378 ccons ::= DEFAULT PLUS scantok term. 379 ccons ::= DEFAULT MINUS scantok term. 380 ccons ::= DEFAULT scantok ID|INDEXED. 381 ccons ::= NOT NULL onconf. 382 ccons ::= PRIMARY KEY sortorder onconf autoinc. 383 ccons ::= UNIQUE onconf. 384 ccons ::= CHECK LP expr RP. 385 ccons ::= REFERENCES nm eidlist_opt refargs. 386 ccons ::= defer_subclause. 387 ccons ::= COLLATE ID|STRING. 388 generated ::= LP expr RP. 389 generated ::= LP expr RP ID. 390 autoinc ::=. 391 autoinc ::= AUTOINCR. 392 refargs ::=. 393 refargs ::= refargs refarg. 394 refarg ::= MATCH nm. 395 refarg ::= ON INSERT refact. 396 refarg ::= ON DELETE refact. 397 refarg ::= ON UPDATE refact. 398 refact ::= SET NULL. 399 refact ::= SET DEFAULT. 400 refact ::= CASCADE. 401 refact ::= RESTRICT. 402 refact ::= NO ACTION. 403 defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt. 404 defer_subclause ::= DEFERRABLE init_deferred_pred_opt. 405 init_deferred_pred_opt ::=. 406 init_deferred_pred_opt ::= INITIALLY DEFERRED. 407 init_deferred_pred_opt ::= INITIALLY IMMEDIATE. 408 conslist_opt ::=. 409 tconscomma ::= COMMA. 410 tcons ::= CONSTRAINT nm. 411 tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf. 412 tcons ::= UNIQUE LP sortlist RP onconf. 413 tcons ::= CHECK LP expr RP onconf. 414 tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt. 415 defer_subclause_opt ::=. 416 onconf ::=. 417 onconf ::= ON CONFLICT resolvetype. 418 orconf ::=. 419 orconf ::= OR resolvetype. 420 resolvetype ::= IGNORE. 421 resolvetype ::= REPLACE. 422 cmd ::= DROP TABLE ifexists fullname. 423 ifexists ::= IF EXISTS. 424 ifexists ::=. 425 cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select. 426 cmd ::= DROP VIEW ifexists fullname. 427 cmd ::= select. 428 select ::= WITH wqlist selectnowith. 429 select ::= WITH RECURSIVE wqlist selectnowith. 430 select ::= selectnowith. 431 selectnowith ::= selectnowith multiselect_op oneselect. 432 multiselect_op ::= UNION. 433 multiselect_op ::= UNION ALL. 434 multiselect_op ::= EXCEPT|INTERSECT. 435 oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt. 436 oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt. 437 values ::= VALUES LP nexprlist RP. 438 values ::= values COMMA LP nexprlist RP. 439 distinct ::= DISTINCT. 440 distinct ::= ALL. 441 distinct ::=. 442 sclp ::=. 443 selcollist ::= sclp scanpt expr scanpt as. 444 selcollist ::= sclp scanpt STAR. 445 selcollist ::= sclp scanpt nm DOT STAR. 446 as ::= AS nm. 447 as ::=. 448 from ::=. 449 from ::= FROM seltablist. 450 stl_prefix ::= seltablist joinop. 451 stl_prefix ::=. 452 seltablist ::= stl_prefix nm dbnm as on_using. 453 seltablist ::= stl_prefix nm dbnm as indexed_by on_using. 454 seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using. 455 seltablist ::= stl_prefix LP select RP as on_using. 456 seltablist ::= stl_prefix LP seltablist RP as on_using. 457 dbnm ::=. 458 dbnm ::= DOT nm. 459 fullname ::= nm. 460 fullname ::= nm DOT nm. 461 xfullname ::= nm. 462 xfullname ::= nm DOT nm. 463 xfullname ::= nm DOT nm AS nm. 464 xfullname ::= nm AS nm. 465 joinop ::= COMMA|JOIN. 466 joinop ::= JOIN_KW JOIN. 467 joinop ::= JOIN_KW nm JOIN. 468 joinop ::= JOIN_KW nm nm JOIN. 469 on_using ::= ON expr. 470 on_using ::= USING LP idlist RP. 471 on_using ::=. [OR] 472 indexed_opt ::=. 473 indexed_by ::= INDEXED BY nm. 474 indexed_by ::= NOT INDEXED. 475 orderby_opt ::=. 476 orderby_opt ::= ORDER BY sortlist. 477 sortlist ::= sortlist COMMA expr sortorder nulls. 478 sortlist ::= expr sortorder nulls. 479 sortorder ::= ASC. 480 sortorder ::= DESC. 481 sortorder ::=. 482 nulls ::= NULLS FIRST. 483 nulls ::= NULLS LAST. 484 nulls ::=. 485 groupby_opt ::=. 486 groupby_opt ::= GROUP BY nexprlist. 487 having_opt ::=. 488 having_opt ::= HAVING expr. 489 limit_opt ::=. 490 limit_opt ::= LIMIT expr. 491 limit_opt ::= LIMIT expr OFFSET expr. 492 limit_opt ::= LIMIT expr COMMA expr. 493 cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret. 494 where_opt ::=. 495 where_opt ::= WHERE expr. 496 where_opt_ret ::=. 497 where_opt_ret ::= WHERE expr. 498 where_opt_ret ::= RETURNING selcollist. 499 where_opt_ret ::= WHERE expr RETURNING selcollist. 500 cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret. 501 setlist ::= setlist COMMA nm EQ expr. 502 setlist ::= setlist COMMA LP idlist RP EQ expr. 503 setlist ::= nm EQ expr. 504 setlist ::= LP idlist RP EQ expr. 505 cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert. 506 cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning. 507 upsert ::=. 508 upsert ::= RETURNING selcollist. 509 upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert. 510 upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert. 511 upsert ::= ON CONFLICT DO NOTHING returning. 512 upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning. 513 returning ::= RETURNING selcollist. 514 insert_cmd ::= INSERT orconf. 515 insert_cmd ::= REPLACE. 516 idlist_opt ::=. 517 idlist_opt ::= LP idlist RP. 518 idlist ::= idlist COMMA nm. 519 idlist ::= nm. 520 expr ::= LP expr RP. 521 expr ::= ID|INDEXED|JOIN_KW. 522 expr ::= nm DOT nm. 523 expr ::= nm DOT nm DOT nm. 524 term ::= NULL|FLOAT|BLOB. 525 term ::= STRING. 526 term ::= INTEGER. 527 expr ::= VARIABLE. 528 expr ::= expr COLLATE ID|STRING. 529 expr ::= CAST LP expr AS typetoken RP. 530 expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP. 531 expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist ORDER BY sortlist RP. 532 expr ::= ID|INDEXED|JOIN_KW LP STAR RP. 533 expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP filter_over. 534 expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist ORDER BY sortlist RP filter_over. 535 expr ::= ID|INDEXED|JOIN_KW LP STAR RP filter_over. 536 term ::= CTIME_KW. 537 expr ::= LP nexprlist COMMA expr RP. 538 expr ::= expr AND expr. 539 expr ::= expr OR expr. 540 expr ::= expr LT|GT|GE|LE expr. 541 expr ::= expr EQ|NE expr. 542 expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr. 543 expr ::= expr PLUS|MINUS expr. 544 expr ::= expr STAR|SLASH|REM expr. 545 expr ::= expr CONCAT expr. 546 likeop ::= NOT LIKE_KW|MATCH. 547 expr ::= expr likeop expr. [LIKE_KW] 548 expr ::= expr likeop expr ESCAPE expr. [LIKE_KW] 549 expr ::= expr ISNULL|NOTNULL. 550 expr ::= expr NOT NULL. 551 expr ::= expr IS expr. 552 expr ::= expr IS NOT expr. 553 expr ::= expr IS NOT DISTINCT FROM expr. 554 expr ::= expr IS DISTINCT FROM expr. 555 expr ::= NOT expr. 556 expr ::= BITNOT expr. 557 expr ::= PLUS|MINUS expr. [BITNOT] 558 expr ::= expr PTR expr. 559 between_op ::= BETWEEN. 560 between_op ::= NOT BETWEEN. 561 expr ::= expr between_op expr AND expr. [BETWEEN] 562 in_op ::= IN. 563 in_op ::= NOT IN. 564 expr ::= expr in_op LP exprlist RP. [IN] 565 expr ::= LP select RP. 566 expr ::= expr in_op LP select RP. [IN] 567 expr ::= expr in_op nm dbnm paren_exprlist. [IN] 568 expr ::= EXISTS LP select RP. 569 expr ::= CASE case_operand case_exprlist case_else END. 570 case_exprlist ::= case_exprlist WHEN expr THEN expr. 571 case_exprlist ::= WHEN expr THEN expr. 572 case_else ::= ELSE expr. 573 case_else ::=. 574 case_operand ::=. 575 exprlist ::=. 576 nexprlist ::= nexprlist COMMA expr. 577 nexprlist ::= expr. 578 paren_exprlist ::=. 579 paren_exprlist ::= LP exprlist RP. 580 cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt. 581 uniqueflag ::= UNIQUE. 582 uniqueflag ::=. 583 eidlist_opt ::=. 584 eidlist_opt ::= LP eidlist RP. 585 eidlist ::= eidlist COMMA nm collate sortorder. 586 eidlist ::= nm collate sortorder. 587 collate ::=. 588 collate ::= COLLATE ID|STRING. 589 cmd ::= DROP INDEX ifexists fullname. 590 cmd ::= VACUUM vinto. 591 cmd ::= VACUUM nm vinto. 592 vinto ::= INTO expr. 593 vinto ::=. 594 cmd ::= PRAGMA nm dbnm. 595 cmd ::= PRAGMA nm dbnm EQ nmnum. 596 cmd ::= PRAGMA nm dbnm LP nmnum RP. 597 cmd ::= PRAGMA nm dbnm EQ minus_num. 598 cmd ::= PRAGMA nm dbnm LP minus_num RP. 599 plus_num ::= PLUS INTEGER|FLOAT. 600 minus_num ::= MINUS INTEGER|FLOAT. 601 cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END. 602 trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause. 603 trigger_time ::= BEFORE|AFTER. 604 trigger_time ::= INSTEAD OF. 605 trigger_time ::=. 606 trigger_event ::= DELETE|INSERT. 607 trigger_event ::= UPDATE. 608 trigger_event ::= UPDATE OF idlist. 609 when_clause ::=. 610 when_clause ::= WHEN expr. 611 trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI. 612 trigger_cmd_list ::= trigger_cmd SEMI. 613 trnm ::= nm DOT nm. 614 tridxby ::= INDEXED BY nm. 615 tridxby ::= NOT INDEXED. 616 trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt. 617 trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt. 618 trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt. 619 trigger_cmd ::= scanpt select scanpt. 620 expr ::= RAISE LP IGNORE RP. 621 expr ::= RAISE LP raisetype COMMA nm RP. 622 raisetype ::= ROLLBACK. 623 raisetype ::= ABORT. 624 raisetype ::= FAIL. 625 cmd ::= DROP TRIGGER ifexists fullname. 626 cmd ::= ATTACH database_kw_opt expr AS expr key_opt. 627 cmd ::= DETACH database_kw_opt expr. 628 key_opt ::=. 629 key_opt ::= KEY expr. 630 cmd ::= REINDEX. 631 cmd ::= REINDEX nm dbnm. 632 cmd ::= ANALYZE. 633 cmd ::= ANALYZE nm dbnm. 634 cmd ::= ALTER TABLE fullname RENAME TO nm. 635 cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist. 636 cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm. 637 add_column_fullname ::= fullname. 638 cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm. 639 cmd ::= create_vtab. 640 cmd ::= create_vtab LP vtabarglist RP. 641 create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm. 642 vtabarg ::=. 643 vtabargtoken ::= ANY. 644 vtabargtoken ::= lp anylist RP. 645 lp ::= LP. 646 with ::= WITH wqlist. 647 with ::= WITH RECURSIVE wqlist. 648 wqas ::= AS. 649 wqas ::= AS MATERIALIZED. 650 wqas ::= AS NOT MATERIALIZED. 651 wqitem ::= nm eidlist_opt wqas LP select RP. 652 wqlist ::= wqitem. 653 wqlist ::= wqlist COMMA wqitem. 654 windowdefn_list ::= windowdefn_list COMMA windowdefn. 655 windowdefn ::= nm AS LP window RP. 656 window ::= PARTITION BY nexprlist orderby_opt frame_opt. 657 window ::= nm PARTITION BY nexprlist orderby_opt frame_opt. 658 window ::= ORDER BY sortlist frame_opt. 659 window ::= nm ORDER BY sortlist frame_opt. 660 window ::= nm frame_opt. 661 frame_opt ::=. 662 frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt. 663 frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt. 664 range_or_rows ::= RANGE|ROWS|GROUPS. 665 frame_bound_s ::= frame_bound. 666 frame_bound_s ::= UNBOUNDED PRECEDING. 667 frame_bound_e ::= frame_bound. 668 frame_bound_e ::= UNBOUNDED FOLLOWING. 669 frame_bound ::= expr PRECEDING|FOLLOWING. 670 frame_bound ::= CURRENT ROW. 671 frame_exclude_opt ::=. 672 frame_exclude_opt ::= EXCLUDE frame_exclude. 673 frame_exclude ::= NO OTHERS. 674 frame_exclude ::= CURRENT ROW. 675 frame_exclude ::= GROUP|TIES. 676 window_clause ::= WINDOW windowdefn_list. 677 filter_over ::= filter_clause over_clause. 678 filter_over ::= over_clause. 679 filter_over ::= filter_clause. 680 over_clause ::= OVER LP window RP. 681 over_clause ::= OVER nm. 682 filter_clause ::= FILTER LP WHERE expr RP. 683 input ::= cmdlist. 684 cmdlist ::= cmdlist ecmd. 685 cmdlist ::= ecmd. 686 ecmd ::= SEMI. 687 ecmd ::= cmdx SEMI. 688 ecmd ::= explain cmdx SEMI. 689 trans_opt ::=. 690 trans_opt ::= TRANSACTION. 691 trans_opt ::= TRANSACTION nm. 692 savepoint_opt ::= SAVEPOINT. 693 savepoint_opt ::=. 694 cmd ::= create_table create_table_args. 695 table_option_set ::= table_option. 696 columnlist ::= columnlist COMMA columnname carglist. 697 columnlist ::= columnname carglist. 698 nm ::= ID|INDEXED|JOIN_KW. 699 nm ::= STRING. 700 typetoken ::= typename. 701 typename ::= ID|STRING. 702 signed ::= plus_num. 703 signed ::= minus_num. 704 carglist ::= carglist ccons. 705 carglist ::=. 706 ccons ::= NULL onconf. 707 ccons ::= GENERATED ALWAYS AS generated. 708 ccons ::= AS generated. 709 conslist_opt ::= COMMA conslist. 710 conslist ::= conslist tconscomma tcons. 711 conslist ::= tcons. 712 tconscomma ::=. 713 defer_subclause_opt ::= defer_subclause. 714 resolvetype ::= raisetype. 715 selectnowith ::= oneselect. 716 oneselect ::= values. 717 sclp ::= selcollist COMMA. 718 as ::= ID|STRING. 719 indexed_opt ::= indexed_by. 720 returning ::=. 721 expr ::= term. 722 likeop ::= LIKE_KW|MATCH. 723 case_operand ::= expr. 724 exprlist ::= nexprlist. 725 nmnum ::= plus_num. 726 nmnum ::= nm. 727 nmnum ::= ON. 728 nmnum ::= DELETE. 729 nmnum ::= DEFAULT. 730 plus_num ::= INTEGER|FLOAT. 731 foreach_clause ::=. 732 foreach_clause ::= FOR EACH ROW. 733 trnm ::= nm. 734 tridxby ::=. 735 database_kw_opt ::= DATABASE. 736 database_kw_opt ::=. 737 kwcolumn_opt ::=. 738 kwcolumn_opt ::= COLUMNKW. 739 vtabarglist ::= vtabarg. 740 vtabarglist ::= vtabarglist COMMA vtabarg. 741 vtabarg ::= vtabarg vtabargtoken. 742 anylist ::=. 743 anylist ::= anylist LP anylist RP. 744 anylist ::= anylist ANY. 745 with ::=. 746 windowdefn_list ::= windowdefn. 747 window ::= frame_opt. 748 749 %token SPACE ILLEGAL. 750