1 // All token codes are small integers with #defines that begin with "TK_"
2 %token_prefix T_
3
4 // The type of the data attached to each token is GValue. This is also the
5 // default type for non-terminals.
6 //
7 %token_type {GValue *}
8 %default_type {GValue *}
9 %token_destructor {if ($$) {
10 #ifdef GDA_DEBUG_NO
11 gchar *str = gda_sql_value_stringify ($$);
12 g_print ("___ token destructor /%s/\n", str)
13 g_free (str);
14 #endif
15 g_value_unset ($$); g_free ($$);}}
16
17 // The generated parser function takes a 4th argument as follows:
18 %extra_argument {GdaSqlParserIface *pdata}
19
20 // This code runs whenever there is a syntax error
21 //
22 %syntax_error {
23 gda_sql_parser_set_syntax_error (pdata->parser);
24 }
25 %stack_overflow {
26 gda_sql_parser_set_overflow_error (pdata->parser);
27 }
28
29 // The name of the generated procedure that implements the parser
30 // is as follows:
gda_oracle_parser_get_type(void)31 %name gda_lemon_postgres_parser
32
33 // The following text is included near the beginning of the C source
34 // code file that implements the parser.
35 //
36 %include {
37 #include <string.h>
38 #include <glib.h>
39 #include <glib-object.h>
40 #include <glib/gi18n-lib.h>
41 #include <libgda/sql-parser/gda-sql-parser-private.h>
42 #include <libgda/sql-parser/gda-statement-struct-util.h>
43 #include <libgda/sql-parser/gda-statement-struct-trans.h>
44 #include <libgda/sql-parser/gda-statement-struct-insert.h>
45 #include <libgda/sql-parser/gda-statement-struct-update.h>
46 #include <libgda/sql-parser/gda-statement-struct-delete.h>
47 #include <libgda/sql-parser/gda-statement-struct-select.h>
48 #include <libgda/sql-parser/gda-statement-struct-compound.h>
49 #include <libgda/sql-parser/gda-statement-struct-parts.h>
50 #include <assert.h>
51
52 typedef struct {
53 GValue *fname;
54 GdaSqlExpr *expr;
55 } UpdateSet;
56
57 typedef struct {
58 gboolean distinct;
59 GdaSqlExpr *expr;
60 } Distinct;
61
62 typedef struct {
63 GdaSqlExpr *count;
64 GdaSqlExpr *offset;
65 } Limit;
66
67 typedef struct {
68 GSList *when_list;
69 GSList *then_list;
70 } CaseBody;
71
72 static GdaSqlOperatorType
73 sql_operation_string_to_operator (const gchar *op)
74 {
75 switch (g_ascii_toupper (*op)) {
76 case 'A':
77 return GDA_SQL_OPERATOR_TYPE_AND;
78 case 'O':
79 return GDA_SQL_OPERATOR_TYPE_OR;
80 case 'N':
81 return GDA_SQL_OPERATOR_TYPE_NOT;
82 case '=':
83 return GDA_SQL_OPERATOR_TYPE_EQ;
84 case 'I':
85 if (op[1] == 'S')
86 return GDA_SQL_OPERATOR_TYPE_IS;
87 else if (op[1] == 'N')
88 return GDA_SQL_OPERATOR_TYPE_IN;
89 else if (op[1] == 'I')
90 return GDA_SQL_OPERATOR_TYPE_ILIKE;
91 break;
92 case 'L':
93 return GDA_SQL_OPERATOR_TYPE_LIKE;
94 case 'B':
95 return GDA_SQL_OPERATOR_TYPE_BETWEEN;
96 case '>':
97 if (op[1] == '=')
98 return GDA_SQL_OPERATOR_TYPE_GEQ;
99 else if (op[1] == 0)
100 return GDA_SQL_OPERATOR_TYPE_GT;
101 break;
102 case '<':
103 if (op[1] == '=')
104 return GDA_SQL_OPERATOR_TYPE_LEQ;
105 else if (op[1] == '>')
106 return GDA_SQL_OPERATOR_TYPE_DIFF;
107 else if (op[1] == 0)
108 return GDA_SQL_OPERATOR_TYPE_LT;
109 break;
110 case '!':
111 if (op[1] == '=')
112 return GDA_SQL_OPERATOR_TYPE_DIFF;
113 else if (op[1] == '~') {
114 if (op[2] == 0)
115 return GDA_SQL_OPERATOR_TYPE_NOT_REGEXP;
116 else if (op[2] == '*')
117 return GDA_SQL_OPERATOR_TYPE_NOT_REGEXP_CI;
118 }
119 break;
120 case '~':
121 if (op[1] == '*')
122 return GDA_SQL_OPERATOR_TYPE_REGEXP_CI;
123 else if (op[1] == 0)
124 return GDA_SQL_OPERATOR_TYPE_REGEXP;
125 break;
126 case 'S':
127 return GDA_SQL_OPERATOR_TYPE_SIMILAR;
128 case '|':
129 if (op[1] == '|')
130 return GDA_SQL_OPERATOR_TYPE_CONCAT;
131 else
132 return GDA_SQL_OPERATOR_TYPE_BITOR;
133 case '+':
134 return GDA_SQL_OPERATOR_TYPE_PLUS;
135 case '-':
136 return GDA_SQL_OPERATOR_TYPE_MINUS;
137 case '*':
138 return GDA_SQL_OPERATOR_TYPE_STAR;
139 case '/':
140 return GDA_SQL_OPERATOR_TYPE_DIV;
141 case '%':
142 return GDA_SQL_OPERATOR_TYPE_REM;
143 case '&':
144 return GDA_SQL_OPERATOR_TYPE_BITAND;
145 }
146 g_error ("Unhandled operator named '%s'\n", op);
147 return 0;
148 }
149
150 static GdaSqlOperatorType
151 string_to_op_type (GValue *value)
152 {
153 GdaSqlOperatorType op;
154 op = sql_operation_string_to_operator (g_value_get_string (value));
155 g_value_reset (value);
156 g_free (value);
157 return op;
158 }
159
160 static GdaSqlExpr *
161 compose_multiple_expr (GdaSqlOperatorType op, GdaSqlExpr *left, GdaSqlExpr *right) {
162 GdaSqlExpr *ret;
163 if (left->cond && (left->cond->operator_type == op)) {
164 ret = left;
165 ret->cond->operands = g_slist_append (ret->cond->operands, right);
166 }
167 else {
168 GdaSqlOperation *cond;
169 ret = gda_sql_expr_new (NULL);
170 cond = gda_sql_operation_new (GDA_SQL_ANY_PART (ret));
171 ret->cond = cond;
172 cond->operator_type = op;
173 cond->operands = g_slist_prepend (NULL, right);
174 GDA_SQL_ANY_PART (right)->parent = GDA_SQL_ANY_PART (cond);
175 cond->operands = g_slist_prepend (cond->operands, left);
176 GDA_SQL_ANY_PART (left)->parent = GDA_SQL_ANY_PART (cond);
177 }
178 return ret;
179 }
180
181 static GdaSqlExpr *
182 create_two_expr (GdaSqlOperatorType op, GdaSqlExpr *left, GdaSqlExpr *right) {
183 GdaSqlExpr *ret;
184 GdaSqlOperation *cond;
185 ret = gda_sql_expr_new (NULL);
186 cond = gda_sql_operation_new (GDA_SQL_ANY_PART (ret));
187 ret->cond = cond;
188 cond->operator_type = op;
189 cond->operands = g_slist_prepend (NULL, right);
190 GDA_SQL_ANY_PART (right)->parent = GDA_SQL_ANY_PART (cond);
191 cond->operands = g_slist_prepend (cond->operands, left);
192 GDA_SQL_ANY_PART (left)->parent = GDA_SQL_ANY_PART (cond);
193 return ret;
194 }
195
196 static GdaSqlExpr *
197 create_uni_expr (GdaSqlOperatorType op, GdaSqlExpr *expr) {
198 GdaSqlExpr *ret;
199 GdaSqlOperation *cond;
200 ret = gda_sql_expr_new (NULL);
201 cond = gda_sql_operation_new (GDA_SQL_ANY_PART (ret));
202 ret->cond = cond;
203 cond->operator_type = op;
204 cond->operands = g_slist_prepend (NULL, expr);
205 GDA_SQL_ANY_PART (expr)->parent = GDA_SQL_ANY_PART (cond);
206 return ret;
207 }
208
209 static GdaSqlStatement *
210 compose_multiple_compounds (GdaSqlStatementCompoundType ctype, GdaSqlStatement *left, GdaSqlStatement *right) {
211 GdaSqlStatement *ret = NULL;
212 GdaSqlStatementCompound *lc = (GdaSqlStatementCompound*) left->contents;
213 if (lc->compound_type == ctype) {
214 GdaSqlStatementCompound *rc = (GdaSqlStatementCompound*) right->contents;
215 if (!rc->stmt_list->next || rc->compound_type == ctype) {
216 GSList *list;
217 for (list = rc->stmt_list; list; list = list->next)
218 GDA_SQL_ANY_PART (((GdaSqlStatement*)list->data)->contents)->parent = GDA_SQL_ANY_PART (lc);
219
220 ret = left;
221 lc->stmt_list = g_slist_concat (lc->stmt_list, rc->stmt_list);
222 rc->stmt_list = NULL;
223 gda_sql_statement_free (right);
224 }
225 }
226 else {
227 ret = gda_sql_statement_new (GDA_SQL_STATEMENT_COMPOUND);
228 gda_sql_statement_compound_set_type (ret, ctype);
229 gda_sql_statement_compound_take_stmt (ret, left);
230 gda_sql_statement_compound_take_stmt (ret, right);
231 }
232 return ret;
233 }
234
235 }
236
237 // The following directive causes tokens ABORT, AFTER, ASC, etc. to
238 // fallback to ID if they will not parse as their original value.
239 %fallback ID
240 ABORT AFTER ANALYZE ASC ATTACH BEFORE BEGIN CASCADE CAST CONFLICT
241 DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR
242 IGNORE IMMEDIATE INITIALLY INSTEAD LIKE ILIKE MATCH PLAN
243 QUERY KEY OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW
244 TEMP TRIGGER VACUUM VIEW VIRTUAL
245 REINDEX RENAME CTIME_KW IF
246 DELIMITER COMMIT ROLLBACK ISOLATION LEVEL SERIALIZABLE READ COMMITTED
247 UNCOMMITTED REPEATABLE WRITE ONLY SAVEPOINT RELEASE COMMENT FORCE WAIT NOWAIT BATCH.
248
249 // Define operator precedence early so that this is the first occurance
250 // of the operator tokens in the grammer. Keeping the operators together
251 // causes them to be assigned integer values that are close together,
252 // which keeps parser tables smaller.
253 %left OR.
254 %left AND.
255 %right NOT.
256 %left IS MATCH NOTLIKE LIKE NOTILIKE ILIKE IN ISNULL NOTNULL DIFF EQ.
257 %left BETWEEN.
258 %left GT LEQ LT GEQ.
259 %left REGEXP REGEXP_CI NOT_REGEXP NOT_REGEXP_CI.
260 %left SIMILAR.
261 %right ESCAPE.
262 %left BITAND BITOR LSHIFT RSHIFT.
263 %left PLUS MINUS.
264 %left STAR SLASH REM.
265 %left CONCAT.
266 %left COLLATE.
267 %right UMINUS UPLUS BITNOT.
268 %left LP RP.
269 %left JOIN INNER NATURAL LEFT RIGHT FULL CROSS.
270 %left UNION EXCEPT.
271 %left INTERSECT.
272 %left PGCAST.
273
274 // force the declaration of the ILLEGAL and SQLCOMMENT tokens
275 %nonassoc ILLEGAL.
276 %nonassoc SQLCOMMENT.
277
278 // Input is a single SQL command
279 %type stmt {GdaSqlStatement *}
280 %destructor stmt {g_print ("Statement destroyed by parser: %p\n", $$); gda_sql_statement_free ($$);}
281 stmt ::= cmd(C) eos. {pdata->parsed_statement = C;}
282 stmt ::= compound(C) eos. {
283 GdaSqlStatementCompound *scompound = (GdaSqlStatementCompound *) C->contents;
284 if (scompound->stmt_list->next)
285 /* real compound (multiple statements) */
286 pdata->parsed_statement = C;
287 else {
288 /* false compound (only 1 select) */
289 pdata->parsed_statement = (GdaSqlStatement*) scompound->stmt_list->data;
290 GDA_SQL_ANY_PART (pdata->parsed_statement->contents)->parent = NULL;
291 g_slist_free (scompound->stmt_list);
292 scompound->stmt_list = NULL;
293 gda_sql_statement_free (C);
294 }
295 }
296 cmd(C) ::= LP cmd(E) RP. {C = E;}
297 compound(C) ::= LP compound(E) RP. {C = E;}
298
299 eos ::= SEMI.
300 eos ::= END_OF_FILE.
301
302 %type cmd {GdaSqlStatement *}
303 %destructor cmd {gda_sql_statement_free ($$);}
304
305 //
306 // Transactions
307 //
308 cmd(C) ::= BEGIN. {C = gda_sql_statement_new (GDA_SQL_STATEMENT_BEGIN);}
309 cmd(C) ::= BEGIN TRANSACTION nm_opt(R). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_BEGIN);
310 gda_sql_statement_trans_take_name (C, R);
311 }
312
313 cmd(C) ::= BEGIN transtype(Y) TRANSACTION nm_opt(R). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_BEGIN);
314 gda_sql_statement_trans_take_mode (C, Y);
315 gda_sql_statement_trans_take_name (C, R);
316 }
317
318 cmd(C) ::= BEGIN transtype(Y) nm_opt(R). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_BEGIN);
319 gda_sql_statement_trans_take_mode (C, Y);
320 gda_sql_statement_trans_take_name (C, R);
321 }
322
323 cmd(C) ::= BEGIN transilev(L). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_BEGIN);
324 gda_sql_statement_trans_set_isol_level (C, L);
325 }
326
327 cmd(C) ::= BEGIN TRANSACTION transilev(L). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_BEGIN);
328 gda_sql_statement_trans_set_isol_level (C, L);
329 }
330
331 cmd(C) ::= BEGIN TRANSACTION transtype(Y). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_BEGIN);
332 gda_sql_statement_trans_take_mode (C, Y);
333 }
334
335 cmd(C) ::= BEGIN TRANSACTION transtype(Y) opt_comma transilev(L). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_BEGIN);
336 gda_sql_statement_trans_take_mode (C, Y);
337 gda_sql_statement_trans_set_isol_level (C, L);
338 }
339
340 cmd(C) ::= BEGIN TRANSACTION transilev(L) opt_comma transtype(Y). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_BEGIN);
341 gda_sql_statement_trans_take_mode (C, Y);
342 gda_sql_statement_trans_set_isol_level (C, L);
343 }
344
345 cmd(C) ::= BEGIN transtype(Y) opt_comma transilev(L). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_BEGIN);
346 gda_sql_statement_trans_take_mode (C, Y);
347 gda_sql_statement_trans_set_isol_level (C, L);
348 }
349
350 cmd(C) ::= BEGIN transilev(L) opt_comma transtype(Y). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_BEGIN);
351 gda_sql_statement_trans_take_mode (C, Y);
352 gda_sql_statement_trans_set_isol_level (C, L);
353 }
354
355 cmd(C) ::= END trans_opt_kw nm_opt(R). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_COMMIT);
356 gda_sql_statement_trans_take_name (C, R);
357 }
358
359 cmd(C) ::= COMMIT nm_opt(R). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_COMMIT);
360 gda_sql_statement_trans_take_name (C, R);
361 }
362
363 cmd(C) ::= COMMIT TRANSACTION nm_opt(R). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_COMMIT);
364 gda_sql_statement_trans_take_name (C, R);
365 }
366
367 cmd(C) ::= COMMIT FORCE STRING. {C = gda_sql_statement_new (GDA_SQL_STATEMENT_COMMIT);}
368 cmd(C) ::= COMMIT FORCE STRING COMMA INTEGER. {C = gda_sql_statement_new (GDA_SQL_STATEMENT_COMMIT);}
369 cmd(C) ::= COMMIT COMMENT STRING. {C = gda_sql_statement_new (GDA_SQL_STATEMENT_COMMIT);}
370 cmd(C) ::= COMMIT COMMENT STRING ora_commit_write. {C = gda_sql_statement_new (GDA_SQL_STATEMENT_COMMIT);}
371 cmd(C) ::= COMMIT ora_commit_write. {C = gda_sql_statement_new (GDA_SQL_STATEMENT_COMMIT);}
372
373 cmd(C) ::= ROLLBACK trans_opt_kw nm_opt(R). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_ROLLBACK);
374 gda_sql_statement_trans_take_name (C, R);
375 }
376
377 ora_commit_write ::= WRITE IMMEDIATE.
378 ora_commit_write ::= WRITE BATCH.
379 ora_commit_write ::= WRITE WAIT.
380 ora_commit_write ::= WRITE NOWAIT.
381 ora_commit_write ::= WRITE IMMEDIATE WAIT.
382 ora_commit_write ::= WRITE IMMEDIATE NOWAIT.
383 ora_commit_write ::= WRITE BATCH WAIT.
384 ora_commit_write ::= WRITE BATCH NOWAIT.
385
386 trans_opt_kw ::= .
387 trans_opt_kw ::= TRANSACTION.
388
389 opt_comma ::= .
390 opt_comma ::= COMMA.
391
392 %type transilev {GdaTransactionIsolation}
393 transilev(L) ::= ISOLATION LEVEL SERIALIZABLE. {L = GDA_TRANSACTION_ISOLATION_SERIALIZABLE;}
394 transilev(L) ::= ISOLATION LEVEL REPEATABLE READ. {L = GDA_TRANSACTION_ISOLATION_REPEATABLE_READ;}
395 transilev(L) ::= ISOLATION LEVEL READ COMMITTED. {L = GDA_TRANSACTION_ISOLATION_READ_COMMITTED;}
396 transilev(L) ::= ISOLATION LEVEL READ UNCOMMITTED. {L = GDA_TRANSACTION_ISOLATION_READ_UNCOMMITTED;}
397
398 nm_opt(R) ::= . {R = NULL;}
399 nm_opt(R) ::= nm(N). {R = N;}
400
401 transtype(A) ::= DEFERRED(X). {A = X;}
402 transtype(A) ::= IMMEDIATE(X). {A = X;}
403 transtype(A) ::= EXCLUSIVE(X). {A = X;}
404 transtype(A) ::= READ WRITE. {A = g_new0 (GValue, 1);
405 g_value_init (A, G_TYPE_STRING);
406 g_value_set_string (A, "READ_WRITE");
407 }
408 transtype(A) ::= READ ONLY. {A = g_new0 (GValue, 1);
409 g_value_init (A, G_TYPE_STRING);
410 g_value_set_string (A, "READ_ONLY");
411 }
412
413 //
414 // Savepoints
415 //
416 cmd(C) ::= SAVEPOINT nm(R). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_SAVEPOINT);
417 gda_sql_statement_trans_take_name (C, R);
418 }
419
420 cmd(C) ::= RELEASE SAVEPOINT nm(R). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_DELETE_SAVEPOINT);
421 gda_sql_statement_trans_take_name (C, R);
422 }
423
424 cmd(C) ::= RELEASE nm(R). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_DELETE_SAVEPOINT);
425 gda_sql_statement_trans_take_name (C, R);
426 }
427
428 cmd(C) ::= ROLLBACK trans_opt_kw TO nm(R). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_ROLLBACK_SAVEPOINT);
429 gda_sql_statement_trans_take_name (C, R);
430 }
431
432 cmd(C) ::= ROLLBACK trans_opt_kw TO SAVEPOINT nm(R). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_ROLLBACK_SAVEPOINT);
433 gda_sql_statement_trans_take_name (C, R);
434 }
435
436 //
437 // INSERT
438 //
439 cmd(C) ::= INSERT opt_on_conflict(O) INTO fullname(X) inscollist_opt(F) VALUES LP rexprlist(Y) RP. {
440 C = gda_sql_statement_new (GDA_SQL_STATEMENT_INSERT);
441 gda_sql_statement_insert_take_table_name (C, X);
442 gda_sql_statement_insert_take_fields_list (C, F);
443 gda_sql_statement_insert_take_1_values_list (C, g_slist_reverse (Y));
444 gda_sql_statement_insert_take_on_conflict (C, O);
445 }
446
447 cmd(C) ::= INSERT opt_on_conflict(O) INTO fullname(X) inscollist_opt(F) VALUES LP rexprlist(Y) RP ins_extra_values(E). {
448 C = gda_sql_statement_new (GDA_SQL_STATEMENT_INSERT);
449 gda_sql_statement_insert_take_table_name (C, X);
450 gda_sql_statement_insert_take_fields_list (C, F);
451 gda_sql_statement_insert_take_1_values_list (C, g_slist_reverse (Y));
452 gda_sql_statement_insert_take_extra_values_list (C, E);
453 gda_sql_statement_insert_take_on_conflict (C, O);
454 }
455
456 cmd(C) ::= INSERT opt_on_conflict(O) INTO fullname(X) inscollist_opt(F) compound(S). {
457 C = gda_sql_statement_new (GDA_SQL_STATEMENT_INSERT);
458 gda_sql_statement_insert_take_table_name (C, X);
459 gda_sql_statement_insert_take_fields_list (C, F);
460 gda_sql_statement_insert_take_select (C, S);
461 gda_sql_statement_insert_take_on_conflict (C, O);
462 }
463
464
465 opt_on_conflict(O) ::= . {O = NULL;}
466 opt_on_conflict(O) ::= OR ID(V). {O = V;}
467
468 %type ins_extra_values {GSList*}
469 %destructor ins_extra_values {GSList *list;
470 for (list = $$; list; list = list->next) {
471 g_slist_foreach ((GSList*) list->data, (GFunc) gda_sql_field_free, NULL);
472 g_slist_free ((GSList*) list->data);
473 }
474 g_slist_free ($$);
475 }
476 ins_extra_values(E) ::= ins_extra_values(A) COMMA LP rexprlist(L) RP. {E = g_slist_append (A, g_slist_reverse (L));}
477 ins_extra_values(E) ::= COMMA LP rexprlist(L) RP. {E = g_slist_append (NULL, g_slist_reverse (L));}
478
479 %type inscollist_opt {GSList*}
480 %destructor inscollist_opt {if ($$) {g_slist_foreach ($$, (GFunc) gda_sql_field_free, NULL); g_slist_free ($$);}}
481 inscollist_opt(A) ::= . {A = NULL;}
482 inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;}
483
484 %type inscollist {GSList*}
485 %destructor inscollist {if ($$) {g_slist_foreach ($$, (GFunc) gda_sql_field_free, NULL); g_slist_free ($$);}}
486 inscollist(A) ::= inscollist(X) COMMA fullname(Y). {GdaSqlField *field;
487 field = gda_sql_field_new (NULL);
488 gda_sql_field_take_name (field, Y);
489 A = g_slist_append (X, field);
490 }
491 inscollist(A) ::= fullname(Y). {GdaSqlField *field = gda_sql_field_new (NULL);
492 gda_sql_field_take_name (field, Y);
493 A = g_slist_prepend (NULL, field);
494 }
495
496 // DELETE
497 cmd(C) ::= DELETE FROM fullname(T) where_opt(X). {C = gda_sql_statement_new (GDA_SQL_STATEMENT_DELETE);
498 gda_sql_statement_delete_take_table_name (C, T);
499 gda_sql_statement_delete_take_condition (C, X);}
500
501 %type where_opt {GdaSqlExpr *}
502 %destructor where_opt {gda_sql_expr_free ($$);}
503 where_opt(A) ::= . {A = NULL;}
504 where_opt(A) ::= WHERE expr(X). {A = X;}
505
506 // UPDATE
507 cmd(C) ::= UPDATE opt_on_conflict(O) fullname(T) SET setlist(S) where_opt(X). {
508 GSList *list;
509 C = gda_sql_statement_new (GDA_SQL_STATEMENT_UPDATE);
510 gda_sql_statement_update_take_table_name (C, T);
511 gda_sql_statement_update_take_on_conflict (C, O);
512 gda_sql_statement_update_take_condition (C, X);
513 for (list = S; list; list = list->next) {
514 UpdateSet *set = (UpdateSet*) list->data;
515 gda_sql_statement_update_take_set_value (C, set->fname, set->expr);
516 g_free (set);
517 }
518 g_slist_free (S);
519 }
520
521 %type setlist {GSList*}
522 %destructor setlist {GSList *list;
523 for (list = $$; list; list = list->next) {
524 UpdateSet *set = (UpdateSet*) list->data;
525 g_value_reset (set->fname); g_free (set->fname);
526 gda_sql_expr_free (set->expr);
527 g_free (set);
528 }
529 g_slist_free ($$);
530 }
531 setlist(A) ::= setlist(Z) COMMA fullname(X) EQ expr(Y). {UpdateSet *set;
532 set = g_new (UpdateSet, 1);
533 set->fname = X;
534 set->expr = Y;
535 A = g_slist_append (Z, set);
536 }
537 setlist(A) ::= fullname(X) EQ expr(Y). {UpdateSet *set;
538 set = g_new (UpdateSet, 1);
539 set->fname = X;
540 set->expr = Y;
541 A = g_slist_append (NULL, set);
542 }
543
544 // COMPOUND SELECT
545 %type compound {GdaSqlStatement *}
546 %destructor compound {gda_sql_statement_free ($$);}
547 //compound(C) ::= LP compound(E) RP. {C = E;}
548 compound(C) ::= selectcmd(S). {
549 C = gda_sql_statement_new (GDA_SQL_STATEMENT_COMPOUND);
550 gda_sql_statement_compound_take_stmt (C, S);
551 }
552 compound(C) ::= compound(L) UNION opt_compound_all(A) compound(R). {
553 C = compose_multiple_compounds (A ? GDA_SQL_STATEMENT_COMPOUND_UNION_ALL : GDA_SQL_STATEMENT_COMPOUND_UNION,
554 L, R);
555 }
556
557 compound(C) ::= compound(L) EXCEPT opt_compound_all(A) compound(R). {
558 C = compose_multiple_compounds (A ? GDA_SQL_STATEMENT_COMPOUND_EXCEPT_ALL : GDA_SQL_STATEMENT_COMPOUND_EXCEPT,
559 L, R);
560 }
561
562 compound(C) ::= compound(L) INTERSECT opt_compound_all(A) compound(R). {
563 C = compose_multiple_compounds (A ? GDA_SQL_STATEMENT_COMPOUND_INTERSECT_ALL : GDA_SQL_STATEMENT_COMPOUND_INTERSECT,
564 L, R);
565 }
566
567 %type opt_compound_all {gboolean}
568 opt_compound_all(A) ::= . {A = FALSE;}
569 opt_compound_all(A) ::= ALL. {A = TRUE;}
570
571
572 // SELECT
573 %type selectcmd {GdaSqlStatement *}
574 %destructor selectcmd {gda_sql_statement_free ($$);}
575 selectcmd(C) ::= SELECT distinct(D) selcollist(W) from(F) where_opt(Y)
576 groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
577 C = gda_sql_statement_new (GDA_SQL_STATEMENT_SELECT);
578 if (D) {
579 gda_sql_statement_select_take_distinct (C, D->distinct, D->expr);
580 g_free (D);
581 }
582 gda_sql_statement_select_take_expr_list (C, W);
583 gda_sql_statement_select_take_from (C, F);
584 gda_sql_statement_select_take_where_cond (C, Y);
585 gda_sql_statement_select_take_group_by (C, P);
586 gda_sql_statement_select_take_having_cond (C, Q);
587 gda_sql_statement_select_take_order_by (C, Z);
588 gda_sql_statement_select_take_limits (C, L.count, L.offset);
589 }
590
591 %type limit_opt {Limit}
592 %destructor limit_opt {gda_sql_expr_free ($$.count); gda_sql_expr_free ($$.offset);}
593 limit_opt(A) ::= . {A.count = NULL; A.offset = NULL;}
594 limit_opt(A) ::= LIMIT expr(X). {A.count = X; A.offset = NULL;}
595 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). {A.count = X; A.offset = Y;}
596 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). {A.count = X; A.offset = Y;}
597
598 %type orderby_opt {GSList *}
599 %destructor orderby_opt {if ($$) {g_slist_foreach ($$, (GFunc) gda_sql_select_order_free, NULL); g_slist_free ($$);}}
600 orderby_opt(A) ::= . {A = 0;}
601 orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;}
602
603 %type sortlist {GSList *}
604 %destructor sortlist {if ($$) {g_slist_foreach ($$, (GFunc) gda_sql_select_order_free, NULL); g_slist_free ($$);}}
605 sortlist(A) ::= sortlist(X) COMMA expr(Y) sortorder(Z). {GdaSqlSelectOrder *order;
606 order = gda_sql_select_order_new (NULL);
607 order->expr = Y;
608 order->asc = Z;
609 A = g_slist_append (X, order);
610 }
611 sortlist(A) ::= expr(Y) sortorder(Z). {GdaSqlSelectOrder *order;
612 order = gda_sql_select_order_new (NULL);
613 order->expr = Y;
614 order->asc = Z;
615 A = g_slist_prepend (NULL, order);
616 }
617
618 %type sortorder {gboolean}
619 sortorder(A) ::= ASC. {A = TRUE;}
620 sortorder(A) ::= DESC. {A = FALSE;}
621 sortorder(A) ::= . {A = TRUE;}
622
623
624 %type having_opt {GdaSqlExpr *}
625 %destructor having_opt {gda_sql_expr_free ($$);}
626 having_opt(A) ::= . {A = NULL;}
627 having_opt(A) ::= HAVING expr(X). {A = X;}
628
629 %type groupby_opt {GSList*}
630 %destructor groupby_opt {if ($$) {g_slist_foreach ($$, (GFunc) gda_sql_expr_free, NULL); g_slist_free ($$);}}
631 groupby_opt(A) ::= . {A = 0;}
632 groupby_opt(A) ::= GROUP BY rnexprlist(X). {A = g_slist_reverse (X);}
633
634 %type from {GdaSqlSelectFrom *}
635 %destructor from {gda_sql_select_from_free ($$);}
636 from(F) ::= . {F = NULL;}
637 from(F) ::= FROM seltablist(X). {F = X;}
638
639 %type seltablist {GdaSqlSelectFrom *}
640 %destructor seltablist {gda_sql_select_from_free ($$);}
641 %type stl_prefix {GdaSqlSelectFrom *}
642 %destructor stl_prefix {gda_sql_select_from_free ($$);}
643
644 seltablist(L) ::= stl_prefix(P) seltarget(T) on_cond(C) using_opt(U). {
645 GSList *last;
646 if (P)
647 L = P;
648 else
649 L = gda_sql_select_from_new (NULL);
650 gda_sql_select_from_take_new_target (L, T);
651 last = g_slist_last (L->joins);
652 if (last) {
653 GdaSqlSelectJoin *join = (GdaSqlSelectJoin *) (last->data);
654 join->expr = C;
655 join->position = g_slist_length (L->targets) - 1;
656 join->use = U;
657 }
658 }
659
660 %type using_opt {GSList*}
661 %destructor using_opt {if ($$) {g_slist_foreach ($$, (GFunc) gda_sql_field_free, NULL); g_slist_free ($$);}}
662 using_opt(U) ::= USING LP inscollist(L) RP. {U = L;}
663 using_opt(U) ::= . {U = NULL;}
664
665 stl_prefix(P) ::= . {P = NULL;}
666 stl_prefix(P) ::= seltablist(L) jointype(J). {GdaSqlSelectJoin *join;
667 P = L;
668 join = gda_sql_select_join_new (GDA_SQL_ANY_PART (P));
669 join->type = J;
670 gda_sql_select_from_take_new_join (P, join);
671 }
672
673
674 %type on_cond {GdaSqlExpr *}
675 %destructor on_cond {gda_sql_expr_free ($$);}
676 on_cond(N) ::= ON expr(E). {N = E;}
677 on_cond(N) ::= . {N = NULL;}
678
679 %type jointype {GdaSqlSelectJoinType}
680 jointype(J) ::= COMMA. {J = GDA_SQL_SELECT_JOIN_CROSS;}
681 jointype(J) ::= JOIN. {J = GDA_SQL_SELECT_JOIN_INNER;}
682 jointype(J) ::= CROSS JOIN. {J = GDA_SQL_SELECT_JOIN_CROSS;}
683 jointype(J) ::= INNER JOIN. {J = GDA_SQL_SELECT_JOIN_INNER;}
684 jointype(J) ::= NATURAL JOIN. {J = GDA_SQL_SELECT_JOIN_NATURAL;}
685 jointype(J) ::= LEFT JOIN. {J = GDA_SQL_SELECT_JOIN_LEFT;}
686 jointype(J) ::= LEFT OUTER JOIN. {J = GDA_SQL_SELECT_JOIN_LEFT;}
687 jointype(J) ::= RIGHT JOIN. {J = GDA_SQL_SELECT_JOIN_RIGHT;}
688 jointype(J) ::= RIGHT OUTER JOIN. {J = GDA_SQL_SELECT_JOIN_RIGHT;}
689 jointype(J) ::= FULL JOIN. {J = GDA_SQL_SELECT_JOIN_FULL;}
690 jointype(J) ::= FULL OUTER JOIN. {J = GDA_SQL_SELECT_JOIN_FULL;}
691
692
693 %type seltarget {GdaSqlSelectTarget *}
694 %destructor seltarget {gda_sql_select_target_free ($$);}
695 seltarget(T) ::= fullname(F) as(A). {T = gda_sql_select_target_new (NULL);
696 gda_sql_select_target_take_alias (T, A);
697 gda_sql_select_target_take_table_name (T, F);
698 }
699 seltarget(T) ::= fullname(F) ID(A). {T = gda_sql_select_target_new (NULL);
700 gda_sql_select_target_take_alias (T, A);
701 gda_sql_select_target_take_table_name (T, F);
702 }
703 seltarget(T) ::= LP compound(S) RP as(A). {T = gda_sql_select_target_new (NULL);
704 gda_sql_select_target_take_alias (T, A);
705 gda_sql_select_target_take_select (T, S);
706 }
707
708 %type selcollist {GSList *}
709 %destructor selcollist {g_slist_foreach ($$, (GFunc) gda_sql_select_field_free, NULL); g_slist_free ($$);}
710
711 %type sclp {GSList *}
712 %destructor sclp {g_slist_foreach ($$, (GFunc) gda_sql_select_field_free, NULL); g_slist_free ($$);}
713 sclp(A) ::= selcollist(X) COMMA. {A = X;}
714 sclp(A) ::= . {A = NULL;}
715
716 selcollist(L) ::= sclp(E) expr(X) as(A). {GdaSqlSelectField *field;
717 field = gda_sql_select_field_new (NULL);
718 gda_sql_select_field_take_expr (field, X);
719 gda_sql_select_field_take_alias (field, A);
720 L = g_slist_append (E, field);}
721 selcollist(L) ::= sclp(E) starname(X). {GdaSqlSelectField *field;
722 field = gda_sql_select_field_new (NULL);
723 gda_sql_select_field_take_star_value (field, X);
724 L = g_slist_append (E, field);}
725
726 starname(S) ::= STAR(X). {S = X;}
727 starname(A) ::= nm(S) DOT STAR(X). {gchar *str;
728 str = g_strdup_printf ("%s.%s", g_value_get_string (S), g_value_get_string (X));
729 A = g_new0 (GValue, 1);
730 g_value_init (A, G_TYPE_STRING);
731 g_value_take_string (A, str);
732 g_value_reset (S); g_free (S);
733 g_value_reset (X); g_free (X);
734 }
735
736 starname(A) ::= nm(C) DOT nm(S) DOT STAR(X). {gchar *str;
737 str = g_strdup_printf ("%s.%s.%s", g_value_get_string (C),
738 g_value_get_string (S), g_value_get_string (X));
739 A = g_new0 (GValue, 1);
740 g_value_init (A, G_TYPE_STRING);
741 g_value_take_string (A, str);
742 g_value_reset (C); g_free (C);
743 g_value_reset (S); g_free (S);
744 g_value_reset (X); g_free (X);
745 }
746
747 as(A) ::= AS fullname(F). {A = F;}
748 as(A) ::= AS value(F). {A = F;}
749 as(A) ::= . {A = NULL;}
750
751 %type distinct {Distinct *}
752 %destructor distinct {if ($$) {if ($$->expr) gda_sql_expr_free ($$->expr); g_free ($$);}}
753 distinct(E) ::= . {E = NULL;}
754 distinct(E) ::= ALL. {E = NULL;}
755 distinct(E) ::= DISTINCT. {E = g_new0 (Distinct, 1); E->distinct = TRUE;}
756 distinct(E) ::= DISTINCT ON expr(X). [OR] {E = g_new0 (Distinct, 1); E->distinct = TRUE; E->expr = X;}
757
758 // Non empty list of expressions
759 %type rnexprlist {GSList *}
760 %destructor rnexprlist {if ($$) {g_slist_foreach ($$, (GFunc) gda_sql_expr_free, NULL); g_slist_free ($$);}}
761 rnexprlist(L) ::= rnexprlist(E) COMMA expr(X). {L = g_slist_prepend (E, X);}
762 rnexprlist(L) ::= expr(E). {L = g_slist_append (NULL, E);}
763
764 // List of expressions
765 %type rexprlist {GSList *}
766 %destructor rexprlist {if ($$) {g_slist_foreach ($$, (GFunc) gda_sql_expr_free, NULL); g_slist_free ($$);}}
767 rexprlist(L) ::= . {L = NULL;}
768 rexprlist(L) ::= rexprlist(E) COMMA expr(X). {L = g_slist_prepend (E, X);}
769 rexprlist(L) ::= expr(E). {L = g_slist_append (NULL, E);}
770
771 // A single expression
772 %type expr {GdaSqlExpr *}
773 %destructor expr {gda_sql_expr_free ($$);}
774 expr(E) ::= pvalue(V). {E = V;}
775 expr(E) ::= value(V). {E = gda_sql_expr_new (NULL); E->value = V;}
776 expr(E) ::= LP expr(X) RP. {E = X;}
777 expr(E) ::= fullname(V). {E = gda_sql_expr_new (NULL); E->value = V;}
778 expr(E) ::= fullname(V) LP rexprlist(A) RP. {GdaSqlFunction *func;
779 E = gda_sql_expr_new (NULL);
780 func = gda_sql_function_new (GDA_SQL_ANY_PART (E));
781 gda_sql_function_take_name (func, V);
782 gda_sql_function_take_args_list (func, g_slist_reverse (A));
783 E->func = func;}
784 expr(E) ::= fullname(V) LP compound(S) RP. {GdaSqlFunction *func;
785 GdaSqlExpr *expr;
786 E = gda_sql_expr_new (NULL);
787 func = gda_sql_function_new (GDA_SQL_ANY_PART (E));
788 gda_sql_function_take_name (func, V);
789 expr = gda_sql_expr_new (GDA_SQL_ANY_PART (func));
790 gda_sql_expr_take_select (expr, S);
791 gda_sql_function_take_args_list (func, g_slist_prepend (NULL, expr));
792 E->func = func;}
793 expr(E) ::= fullname(V) LP starname(A) RP. {GdaSqlFunction *func;
794 GdaSqlExpr *expr;
795 E = gda_sql_expr_new (NULL);
796 func = gda_sql_function_new (GDA_SQL_ANY_PART (E));
797 gda_sql_function_take_name (func, V);
798 expr = gda_sql_expr_new (GDA_SQL_ANY_PART (func));
799 expr->value = A;
800 gda_sql_function_take_args_list (func, g_slist_prepend (NULL, expr));
801 E->func = func;}
802 expr(E) ::= CAST LP expr(A) AS fullname(T) RP. {E = A;
803 A->cast_as = g_value_dup_string (T);
804 g_value_reset (T);
805 g_free (T);}
806 expr(E) ::= expr(A) PGCAST fullname(T). {E = A;
807 A->cast_as = g_value_dup_string (T);
808 g_value_reset (T);
809 g_free (T);}
810
811 expr(C) ::= expr(L) PLUS|MINUS(O) expr(R). {C = compose_multiple_expr (string_to_op_type (O), L, R);}
812 expr(C) ::= expr(L) STAR expr(R). {C = compose_multiple_expr (GDA_SQL_OPERATOR_TYPE_STAR, L, R);}
813 expr(C) ::= expr(L) SLASH|REM(O) expr(R). {C = create_two_expr (string_to_op_type (O), L, R);}
814 expr(C) ::= expr(L) BITAND|BITOR(O) expr(R). {C = create_two_expr (string_to_op_type (O), L, R);}
815
816 expr(C) ::= MINUS expr(X). [UMINUS] {C = create_uni_expr (GDA_SQL_OPERATOR_TYPE_MINUS, X);}
817 expr(C) ::= PLUS expr(X). [UPLUS] {C = create_uni_expr (GDA_SQL_OPERATOR_TYPE_PLUS, X);}
818
819 expr(C) ::= expr(L) AND expr(R). {C = compose_multiple_expr (GDA_SQL_OPERATOR_TYPE_AND, L, R);}
820 expr(C) ::= expr(L) OR expr(R). {C = compose_multiple_expr (GDA_SQL_OPERATOR_TYPE_OR, L, R);}
821 expr(C) ::= expr(L) CONCAT expr(R). {C = compose_multiple_expr (GDA_SQL_OPERATOR_TYPE_CONCAT, L, R);}
822
823 expr(C) ::= expr(L) GT|LEQ|GEQ|LT(O) expr(R). {C = create_two_expr (string_to_op_type (O), L, R);}
824 expr(C) ::= expr(L) DIFF|EQ(O) expr(R). {C = create_two_expr (string_to_op_type (O), L, R);}
825 expr(C) ::= expr(L) LIKE expr(R). {C = create_two_expr (GDA_SQL_OPERATOR_TYPE_LIKE, L, R);}
826 expr(C) ::= expr(L) ILIKE expr(R). {C = create_two_expr (GDA_SQL_OPERATOR_TYPE_ILIKE, L, R);}
827 expr(C) ::= expr(L) NOTLIKE expr(R). {C = create_two_expr (GDA_SQL_OPERATOR_TYPE_NOTLIKE, L, R);}
828 expr(C) ::= expr(L) NOTILIKE expr(R). {C = create_two_expr (GDA_SQL_OPERATOR_TYPE_NOTILIKE, L, R);}
829 expr(C) ::= expr(L) REGEXP|REGEXP_CI|NOT_REGEXP|NOT_REGEXP_CI|SIMILAR(O) expr(R). {C = create_two_expr (string_to_op_type (O), L, R);}
830 expr(C) ::= expr(L) BETWEEN expr(R) AND expr(E). {GdaSqlOperation *cond;
831 C = gda_sql_expr_new (NULL);
832 cond = gda_sql_operation_new (GDA_SQL_ANY_PART (C));
833 C->cond = cond;
834 cond->operator_type = GDA_SQL_OPERATOR_TYPE_BETWEEN;
835 cond->operands = g_slist_append (NULL, L);
836 GDA_SQL_ANY_PART (L)->parent = GDA_SQL_ANY_PART (cond);
837 cond->operands = g_slist_append (cond->operands, R);
838 GDA_SQL_ANY_PART (R)->parent = GDA_SQL_ANY_PART (cond);
839 cond->operands = g_slist_append (cond->operands, E);
840 GDA_SQL_ANY_PART (E)->parent = GDA_SQL_ANY_PART (cond);
841 }
842
843 expr(C) ::= expr(L) NOT BETWEEN expr(R) AND expr(E). {GdaSqlOperation *cond;
844 GdaSqlExpr *expr;
845 expr = gda_sql_expr_new (NULL);
846 cond = gda_sql_operation_new (GDA_SQL_ANY_PART (expr));
847 expr->cond = cond;
848 cond->operator_type = GDA_SQL_OPERATOR_TYPE_BETWEEN;
849 cond->operands = g_slist_append (NULL, L);
850 GDA_SQL_ANY_PART (L)->parent = GDA_SQL_ANY_PART (cond);
851 cond->operands = g_slist_append (cond->operands, R);
852 GDA_SQL_ANY_PART (R)->parent = GDA_SQL_ANY_PART (cond);
853 cond->operands = g_slist_append (cond->operands, E);
854 GDA_SQL_ANY_PART (E)->parent = GDA_SQL_ANY_PART (cond);
855
856 C = gda_sql_expr_new (NULL);
857 cond = gda_sql_operation_new (GDA_SQL_ANY_PART (C));
858 C->cond = cond;
859 cond->operator_type = GDA_SQL_OPERATOR_TYPE_NOT;
860 cond->operands = g_slist_prepend (NULL, expr);
861 GDA_SQL_ANY_PART (expr)->parent = GDA_SQL_ANY_PART (cond);
862 }
863
864 expr(C) ::= NOT expr(R). {C = create_uni_expr (GDA_SQL_OPERATOR_TYPE_NOT, R);}
865 expr(C) ::= BITNOT expr(R). {C = create_uni_expr (GDA_SQL_OPERATOR_TYPE_BITNOT, R);}
866 expr(C) ::= expr(R) uni_op(O) . {C = create_uni_expr (O, R);}
867
868 expr(C) ::= expr(L) IS expr(R). {C = create_two_expr (GDA_SQL_OPERATOR_TYPE_IS, L, R);}
869 expr(E) ::= LP compound(S) RP. {E = gda_sql_expr_new (NULL); gda_sql_expr_take_select (E, S);}
870 expr(E) ::= expr(R) IN LP rexprlist(L) RP. {GdaSqlOperation *cond;
871 GSList *list;
872 E = gda_sql_expr_new (NULL);
873 cond = gda_sql_operation_new (GDA_SQL_ANY_PART (E));
874 E->cond = cond;
875 cond->operator_type = GDA_SQL_OPERATOR_TYPE_IN;
876 cond->operands = g_slist_prepend (g_slist_reverse (L), R);
877 for (list = cond->operands; list; list = list->next)
878 GDA_SQL_ANY_PART (list->data)->parent = GDA_SQL_ANY_PART (cond);
879 }
880 expr(E) ::= expr(R) IN LP compound(S) RP. {GdaSqlOperation *cond;
881 GdaSqlExpr *expr;
882 E = gda_sql_expr_new (NULL);
883 cond = gda_sql_operation_new (GDA_SQL_ANY_PART (E));
884 E->cond = cond;
885 cond->operator_type = GDA_SQL_OPERATOR_TYPE_IN;
886
887 expr = gda_sql_expr_new (GDA_SQL_ANY_PART (cond));
888 gda_sql_expr_take_select (expr, S);
889 cond->operands = g_slist_prepend (NULL, expr);
890 cond->operands = g_slist_prepend (cond->operands, R);
891 GDA_SQL_ANY_PART (R)->parent = GDA_SQL_ANY_PART (cond);
892 }
893 expr(E) ::= expr(R) NOT IN LP rexprlist(L) RP. {GdaSqlOperation *cond;
894 GSList *list;
895 E = gda_sql_expr_new (NULL);
896 cond = gda_sql_operation_new (GDA_SQL_ANY_PART (E));
897 E->cond = cond;
898 cond->operator_type = GDA_SQL_OPERATOR_TYPE_NOTIN;
899 cond->operands = g_slist_prepend (g_slist_reverse (L), R);
900 for (list = cond->operands; list; list = list->next)
901 GDA_SQL_ANY_PART (list->data)->parent = GDA_SQL_ANY_PART (cond);
902 }
903 expr(E) ::= expr(R) NOT IN LP compound(S) RP. {GdaSqlOperation *cond;
904 GdaSqlExpr *expr;
905 E = gda_sql_expr_new (NULL);
906 cond = gda_sql_operation_new (GDA_SQL_ANY_PART (E));
907 E->cond = cond;
908 cond->operator_type = GDA_SQL_OPERATOR_TYPE_NOTIN;
909
910 expr = gda_sql_expr_new (GDA_SQL_ANY_PART (cond));
911 gda_sql_expr_take_select (expr, S);
912 cond->operands = g_slist_prepend (NULL, expr);
913 cond->operands = g_slist_prepend (cond->operands, R);
914 GDA_SQL_ANY_PART (R)->parent = GDA_SQL_ANY_PART (cond);
915 }
916 expr(A) ::= CASE case_operand(X) case_exprlist(Y) case_else(Z) END. {
917 GdaSqlCase *sc;
918 GSList *list;
919 A = gda_sql_expr_new (NULL);
920 sc = gda_sql_case_new (GDA_SQL_ANY_PART (A));
921 sc->base_expr = X;
922 sc->else_expr = Z;
923 sc->when_expr_list = Y.when_list;
924 sc->then_expr_list = Y.then_list;
925 A->case_s = sc;
926 for (list = sc->when_expr_list; list; list = list->next)
927 GDA_SQL_ANY_PART (list->data)->parent = GDA_SQL_ANY_PART (sc);
928 for (list = sc->then_expr_list; list; list = list->next)
929 GDA_SQL_ANY_PART (list->data)->parent = GDA_SQL_ANY_PART (sc);
930 }
931
932 %type case_operand {GdaSqlExpr*}
933 %destructor case_operand {gda_sql_expr_free ($$);}
934 case_operand(A) ::= expr(X). {A = X;}
935 case_operand(A) ::= . {A = NULL;}
936
937 %type case_exprlist {CaseBody}
938 %destructor case_exprlist {g_slist_foreach ($$.when_list, (GFunc) gda_sql_expr_free, NULL); g_slist_free ($$.when_list);
939 g_slist_foreach ($$.then_list, (GFunc) gda_sql_expr_free, NULL); g_slist_free ($$.then_list);}
940
941 case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
942 A.when_list = g_slist_append (X.when_list, Y);
943 A.then_list = g_slist_append (X.then_list, Z);
944 }
945 case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
946 A.when_list = g_slist_prepend (NULL, Y);
947 A.then_list = g_slist_prepend (NULL, Z);
948 }
949
950 %type case_else {GdaSqlExpr*}
951 %destructor case_else {gda_sql_expr_free ($$);}
952 case_else(A) ::= ELSE expr(X). {A = X;}
953 case_else(A) ::= . {A = NULL;}
954
955 %type uni_op {GdaSqlOperatorType}
956 uni_op(O) ::= ISNULL. {O = GDA_SQL_OPERATOR_TYPE_ISNULL;}
957 uni_op(O) ::= IS NOTNULL. {O = GDA_SQL_OPERATOR_TYPE_ISNOTNULL;}
958
959
960 // Values: for all constants (G_TYPE_STRING GValue)
961 value(V) ::= NULL. {V = NULL;}
962 value(V) ::= STRING(S). {V = S;}
963 //value(V) ::= TEXTUAL(T). {V = T;}
964 value(V) ::= INTEGER(I). {V = I;}
965 value(V) ::= FLOAT(F). {V = F;}
966
967 // pvalue: values which are parameters (GdaSqlExpr)
968 %type pvalue {GdaSqlExpr *}
969 %destructor pvalue {gda_sql_expr_free ($$);}
970 pvalue(E) ::= UNSPECVAL LSBRACKET paramspec(P) RSBRACKET. {E = gda_sql_expr_new (NULL); E->param_spec = P;}
971 pvalue(E) ::= value(V) LSBRACKET paramspec(P) RSBRACKET. {E = gda_sql_expr_new (NULL); E->value = V; E->param_spec = P;}
972 pvalue(E) ::= SIMPLEPARAM(S). {E = gda_sql_expr_new (NULL); E->param_spec = gda_sql_param_spec_new (S);}
973
974 // paramspec: parameter's specifications
975 %type paramspec {GdaSqlParamSpec *}
976 %destructor paramspec {gda_sql_param_spec_free ($$);}
977 paramspec(P) ::= . {P = NULL;}
978 paramspec(P) ::= paramspec(E) PNAME(N). {if (!E) P = gda_sql_param_spec_new (NULL); else P = E;
979 gda_sql_param_spec_take_name (P, N);}
980 paramspec(P) ::= paramspec(E) PDESCR(N). {if (!E) P = gda_sql_param_spec_new (NULL); else P = E;
981 gda_sql_param_spec_take_descr (P, N);}
982 paramspec(P) ::= paramspec(E) PTYPE(N). {if (!E) P = gda_sql_param_spec_new (NULL); else P = E;
983 gda_sql_param_spec_take_type (P, N);}
984 paramspec(P) ::= paramspec(E) PNULLOK(N). {if (!E) P = gda_sql_param_spec_new (NULL); else P = E;
985 gda_sql_param_spec_take_nullok (P, N);}
986
987 // The name of a column or table can be any of the following:
988 //
989 nm(A) ::= JOIN(X). {A = X;}
990 nm(A) ::= ID(X). {A = X;}
991 nm(A) ::= TEXTUAL(X). {A = X;}
992
993 // Fully qualified name
994 fullname(A) ::= nm(X). {A = X;}
995 fullname(A) ::= nm(S) DOT nm(X). {gchar *str;
996 str = g_strdup_printf ("%s.%s", g_value_get_string (S), g_value_get_string (X));
997 A = g_new0 (GValue, 1);
998 g_value_init (A, G_TYPE_STRING);
999 g_value_take_string (A, str);
1000 g_value_reset (S); g_free (S);
1001 g_value_reset (X); g_free (X);
1002 }
1003
1004 fullname(A) ::= nm(C) DOT nm(S) DOT nm(X). {gchar *str;
1005 str = g_strdup_printf ("%s.%s.%s", g_value_get_string (C),
1006 g_value_get_string (S), g_value_get_string (X));
1007 A = g_new0 (GValue, 1);
1008 g_value_init (A, G_TYPE_STRING);
1009 g_value_take_string (A, str);
1010 g_value_reset (C); g_free (C);
1011 g_value_reset (S); g_free (S);
1012 g_value_reset (X); g_free (X);
1013 }
1014