• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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