/[vdw]/trunk/obj_srvr.y
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/obj_srvr.y

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (hide annotations)
Sun Feb 6 14:32:43 2005 UTC (19 years, 3 months ago) by dpavlin
File size: 17808 byte(s)
another try

1 dpavlin 1 /*
2     * This SQL Parser is copied from the O'Reilly Lex & Yacc book, 2nd Edition,
3     * 1995, by John R. Levine, Tony Mason, and Doug Brown. I only copied the
4     * query-related language subset. Added some stuff so it could interface w/
5     * Obj_Srvr.pm.
6     *
7     * Jeremy Hickerson, 5/21/2003
8     */
9    
10     %{
11     #define YYDEBUG 0
12     extern int yydebug = 0; /* jhjh */
13    
14     #include <string.h>
15     #include "obj_srvr.h"
16     /* #include "flexdef.h" */
17    
18     char fullname[255];
19     char temp[255];
20     char tmpstr[3];
21     char perl_op[31];
22     char tmp_str[31];
23    
24     void yyerror();
25     char *alloca ();
26     void end_sql();
27     %}
28    
29     /* symbolic tokens */
30     /* jhjh %union {
31     int intval;
32     double floatval;
33     char *strval;
34     int subtok;
35     } */
36    
37 dpavlin 3 %union {
38     int intval;
39     char *strval;
40     double floatval;
41     int subtok;
42     }
43    
44 dpavlin 1 %token <strval> NAME
45     %token <strval> STRING
46     %token <strval> INTNUM APPROXNUM
47    
48     %type <strval> statement query_exp query_term query_spec opt_all_distinct
49     %type <strval> selection table_exp opt_where_clause from_clause
50     %type <strval> table_ref_commalist table_ref where_clause opt_order_by_clause
51     %type <strval> opt_group_by_clause column_ref_commalist opt_having_clause
52     %type <strval> search_condition predicate comparison_predicate between_predicate
53     %type <strval> comparison
54     %type <strval> like_predicate opt_escape test_for_null in_predicate atom_commalist
55     %type <strval> all_or_any_predicate any_all_some existence_test subquery
56     %type <strval> scalar_exp scalar_exp_commalist atom parameter_ref function_ref
57     %type <strval> literal table column_ref column cursor parameter range_variable
58     %type <strval> user sql when_action
59    
60     /* type for literals */
61     %type <strval> '(' ')' '.'
62    
63     /* operators */
64     %left <strval> OR
65     %left <strval> AND
66     %left <strval> NOT
67     %left <strval> COMP_EQ /* = */
68     %left <strval> COMP_NE1 /* <> */
69     %left <strval> COMP_NE2 /* != */
70     %left <strval> COMP_LT /* < */
71     %left <strval> COMP_GT /* > */
72     %left <strval> COMP_LE /* <= */
73     %left <strval> COMP_GE /* >= */
74     %left <strval> '+' '-'
75     %left <strval> '*' '/'
76     %nonassoc <strval> UMINUS
77    
78    
79     /* literal keyword tokens */
80 dpavlin 3 /* %token <strval> ALL AMMSC ANY AS ASC AUTHORIZATION BETWEEN BY CHARACTER */
81     %token <strval> ALL AMMSC AS ASC AUTHORIZATION BETWEEN BY CHARACTER
82 dpavlin 1 %token <strval> CHECK CLOSE CONTINUE CURRENT CURSOR DECIMAL DECLARE DEFAULT
83     %token <strval> DESC DISTINCT DOUBLE ESCAPE EXISTS FETCH FLOAT FOR FOREIGN
84     %token <strval> FOUND FROM GOTO GROUP HAVING IN INDICATOR INTEGER INTO IS KEY
85     %token <strval> LANGUAGE LIKE NULLX NUMERIC OF ON OPEN OPTION ORDER PARAMETER
86     %token <strval> PRECISION PRIMARY PRIVILEGES PROCEDURE REAL REFERENCES SCHEMA
87     %token <strval> SELECT SMALLINT SOME SQLCODE SQLERROR TO UNION UNIQUE USER
88     %token <strval> VALUES WHENEVER WHERE WITH WORK
89    
90     %%
91    
92     statement:
93     query_exp ';' { end_sql(); return 0; }
94     | statement query_exp ';' { end_sql(); return 0; }
95     ;
96    
97     /* query expressions */
98     query_exp:
99     query_term
100     | query_exp UNION query_term
101     | query_exp UNION ALL query_term
102     ;
103    
104     query_term:
105     query_spec
106     | '(' query_exp ')'
107     ;
108    
109     query_spec:
110     SELECT opt_all_distinct selection table_exp {
111     strcpy(parsed_sql.column_list, $3);
112     }
113     ;
114    
115     opt_all_distinct:
116     /* empty */
117     | ALL
118     | DISTINCT
119     ;
120    
121     selection:
122     scalar_exp_commalist
123     | '*'
124     ;
125    
126     table_exp:
127     from_clause
128     opt_where_clause
129     opt_order_by_clause opt_group_by_clause opt_having_clause
130     ;
131    
132     opt_where_clause:
133     /* empty */
134     | where_clause
135     ;
136    
137     from_clause:
138     FROM table_ref_commalist {
139     strcpy(parsed_sql.table_list, $2);
140     }
141     ;
142    
143     table_ref_commalist:
144     table_ref
145     | table_ref_commalist ',' table_ref {
146     printf("Multiple-table query not handled\n"); glb_errflag = 1;
147     }
148     ;
149    
150     table_ref:
151     table
152     | table range_variable
153     ;
154    
155     where_clause:
156     WHERE search_condition {
157     strcpy(parsed_sql.where_clause, $2);
158     }
159     ;
160    
161     opt_order_by_clause:
162     /* empty */
163     | ORDER BY column_ref_commalist {
164     strcpy(parsed_sql.order_by, $3);
165     }
166     ;
167    
168     opt_group_by_clause:
169     /* empty */
170     | GROUP BY column_ref_commalist
171     ;
172    
173     column_ref_commalist:
174     column_ref
175     | column_ref_commalist ',' column_ref {
176     strcpy($$, $1);
177     strcat($$, ",");
178     strcat($$, $3);
179     }
180     ;
181    
182     opt_having_clause:
183     /* empty */
184     | HAVING search_condition {
185     printf("HAVING condition not handled\n"); glb_errflag = 1;
186     }
187     ;
188    
189    
190     /* search conditions */
191     search_condition:
192     search_condition OR search_condition {
193     strcpy($$, $1);
194     strcat($$, ","); /* use comma's for spaces because of obj_srvr.pm */
195     strcat($$, $2);
196     strcat($$, ",");
197     strcat($$, $3);
198     }
199     | search_condition AND search_condition {
200     strcpy($$, $1);
201     strcat($$, ","); /* use comma's for spaces because of obj_srvr.pm */
202     strcat($$, $2);
203     strcat($$, ",");
204     strcat($$, $3);
205     }
206     | NOT search_condition {
207     strcpy($$, $1);
208     strcat($$, ","); /* use comma's for spaces because of obj_srvr.pm */
209     strcat($$, $2);
210     }
211     | '(' search_condition ')' {
212     strcpy($$, $1);
213     strcat($$, ","); /* use comma's for spaces because of obj_srvr.pm */
214     strcat($$, $2);
215     strcat($$, ",");
216     strcat($$, $3);
217     }
218     | predicate
219     ;
220    
221     predicate:
222     comparison_predicate
223     | between_predicate
224     | like_predicate
225     | test_for_null
226     | in_predicate
227     | all_or_any_predicate
228     | existence_test
229     ;
230    
231     comparison_predicate:
232     scalar_exp comparison scalar_exp {
233    
234     strcpy(perl_op,
235     call_perl_tr_op(parsed_sql.table_list, $1, $2, $3) );
236     /* only one table allowed in "table_list" */
237    
238     if ( strlen(perl_op) == 15 &&
239     perl_op[0] == 'd' &&
240     perl_op[1] == 'a' &&
241     perl_op[2] == 't' &&
242     perl_op[3] == 'e' &&
243     perl_op[4] == '_' &&
244     perl_op[5] == 'c' &&
245     perl_op[6] == 'o' &&
246     perl_op[7] == 'm' &&
247     perl_op[8] == 'p' &&
248     perl_op[9] == 'a' &&
249     perl_op[10] == 'r' &&
250     perl_op[11] == 'e' ) {
251    
252     strcpy(tmp_str, perl_op);
253     perl_op[0] = tmp_str[13]; /* tmp_str[12] is '_' */
254     perl_op[1] = tmp_str[14];
255     perl_op[2] = '\0';
256    
257     sprintf($$, "date_compare(,%s,\\\\,'%s'\\\\,%s)",
258     $1, perl_op, $3);
259     /* commas around 1st %s translate into spaces; */
260     /* need spaces so $subst_where will be correct */
261     /* double escape so perl will see as the */
262     /* character '\' rather than a perl escape */
263     }
264     else {
265     strcpy($$, $1);
266     strcat($$, ","); /* use comma's for spaces because of
267     obj_srvr.pm */
268     strcat($$, perl_op);
269     strcat($$, ",");
270     strcat($$, $3);
271     }
272     }
273     | scalar_exp comparison subquery
274     ;
275    
276     comparison:
277     COMP_EQ
278     | COMP_NE1
279     | COMP_NE2
280     | COMP_LT
281     | COMP_GT
282     | COMP_LE
283     | COMP_GE
284     ;
285    
286     between_predicate:
287     scalar_exp NOT BETWEEN scalar_exp AND scalar_exp {
288    
289     strcpy(perl_op,
290     call_perl_tr_op(parsed_sql.table_list, $1, ">=", $4) );
291     /* only one table allowed in "table_list" */
292    
293     if ( strlen(perl_op) == 15 &&
294     perl_op[0] == 'd' &&
295     perl_op[1] == 'a' &&
296     perl_op[2] == 't' &&
297     perl_op[3] == 'e' &&
298     perl_op[4] == '_' &&
299     perl_op[5] == 'c' &&
300     perl_op[6] == 'o' &&
301     perl_op[7] == 'm' &&
302     perl_op[8] == 'p' &&
303     perl_op[9] == 'a' &&
304     perl_op[10] == 'r' &&
305     perl_op[11] == 'e' ) {
306    
307     sprintf($$, "!(date_compare(,%s,\\\\,'%s'\\\\,%s),and,date_compare(,%s,\\\\,'%s'\\\\,%s))",
308     $1, ">=", $4, $1, "<=", $6);
309     /* commas around 1st %s translate into spaces; */
310     /* need spaces so $subst_where will be correct */
311     /* double escape so perl will see as the */
312     /* character '\' rather than a perl escape */
313     }
314     else {
315     strcpy($$, "!(");
316     strcat($$, $1);
317     strcat($$, ","); /* use comma's for spaces because of
318     obj_srvr.pm */
319     strcat($$, ">=");
320     strcat($$, ",");
321     strcat($$, $4);
322     strcat($$, ",and,");
323     strcat($$, $1);
324     strcat($$, ",");
325     strcat($$, "<=");
326     strcat($$, ",");
327     strcat($$, $6);
328     strcat($$, ")");
329     }
330     }
331    
332     | scalar_exp BETWEEN scalar_exp AND scalar_exp {
333    
334     strcpy(perl_op,
335     call_perl_tr_op(parsed_sql.table_list, $1, ">=", $3) );
336     /* only one table allowed in "table_list" */
337    
338     if ( strlen(perl_op) == 15 &&
339     perl_op[0] == 'd' &&
340     perl_op[1] == 'a' &&
341     perl_op[2] == 't' &&
342     perl_op[3] == 'e' &&
343     perl_op[4] == '_' &&
344     perl_op[5] == 'c' &&
345     perl_op[6] == 'o' &&
346     perl_op[7] == 'm' &&
347     perl_op[8] == 'p' &&
348     perl_op[9] == 'a' &&
349     perl_op[10] == 'r' &&
350     perl_op[11] == 'e' ) {
351    
352     sprintf($$, "date_compare(,%s,\\\\,'%s'\\\\,%s),and,date_compare(,%s,\\\\,'%s'\\\\,%s)",
353     $1, ">=", $3, $1, "<=", $5);
354     /* commas around 1st %s translate into spaces; */
355     /* need spaces so $subst_where will be correct */
356     /* double escape so perl will see as the */
357     /* character '\' rather than a perl escape */
358     }
359     else {
360     strcpy($$, $1);
361     strcat($$, ","); /* use comma's for spaces because of
362     obj_srvr.pm */
363     strcat($$, ">=");
364     strcat($$, ",");
365     strcat($$, $3);
366     strcat($$, ",and,");
367     strcat($$, $1);
368     strcat($$, ",");
369     strcat($$, "<=");
370     strcat($$, ",");
371     strcat($$, $5);
372     }
373     }
374     ;
375    
376     like_predicate:
377     scalar_exp NOT LIKE atom opt_escape {
378     strcpy($$, call_perl_like2re($1, $2, $3, $4) );
379     }
380     | scalar_exp LIKE atom opt_escape {
381     strcpy($$, call_perl_like2re($1, $2, $3, "") );
382     }
383     ;
384    
385    
386     opt_escape:
387     /* empty */
388     | ESCAPE atom {
389     printf("Escape not handled\n"); glb_errflag = 1;
390     }
391     ;
392    
393     test_for_null:
394     column_ref IS NOT NULLX {
395     strcpy($$, $1);
396     strcat($$, ","); /* use comma's for spaces because of obj_srvr.pm */
397     strcat($$, $2);
398     strcat($$, ",");
399     strcat($$, $3);
400     strcat($$, ",");
401     strcat($$, $4);
402     }
403     | column_ref IS NULLX {
404     strcpy($$, $1);
405     strcat($$, ",");
406     strcat($$, $2);
407     strcat($$, ",");
408     strcat($$, $3);
409     }
410     ;
411    
412     in_predicate:
413     scalar_exp NOT IN subquery {
414     printf("Subquery not handled\n"); glb_errflag = 1;
415     }
416     | scalar_exp IN subquery {
417     printf("Subquery not handled\n"); glb_errflag = 1;
418     }
419     | scalar_exp NOT IN '(' atom_commalist ')' {
420     /* Translate into equivalent perl expression for reval in Obj_Srvr.pm */
421     /* (Use comma's for spaces because that's how Obj_Srvr.pm expects */
422     /* it. Obj_Srvr.pm will convert comma's to spaces before reval.) */
423     /* perl-escape foward slashes and parentheses to avoid screwing up */
424     /* first round of perl parsing (wh/ uses reg. exp's), before reval(). */
425     strcpy($$, "!grep \\/^");
426     strcat($$, $1);
427     strcat($$, "$\\/\\\\, "); /* double escape so perl will see as the */
428     /* character '\' rather than a perl escape */
429     strcat($$, "\\(");
430     strcat($$, $4);
431     strcat($$, "\\)");
432     }
433     | scalar_exp IN '(' atom_commalist ')' {
434     /* Translate into equivalent perl expression for reval in Obj_Srvr.pm */
435     strcpy($$, "grep \\/^");
436     strcat($$, $1);
437     strcat($$, "$\\/\\\\, ");
438     strcat($$, "\\(");
439     strcat($$, $4);
440     strcat($$, "\\)");
441     }
442     ;
443    
444     atom_commalist:
445     atom
446     | atom_commalist ',' atom {
447     strcpy($$, $1);
448     strcat($$, "\\\\,"); /* save from perl-parse (see in_predicate:) */
449     strcat($$, $3);
450     }
451     ;
452    
453     all_or_any_predicate:
454     scalar_exp comparison any_all_some subquery {
455     printf("Subquery not handled\n"); glb_errflag = 1;
456     }
457     ;
458    
459     any_all_some:
460 dpavlin 3 /* ANY */
461 dpavlin 1 | ALL
462     | SOME
463     ;
464    
465     existence_test:
466     EXISTS subquery
467     { printf("Subquery not handled\n"); glb_errflag = 1; }
468     ;
469    
470     /* jhjh - we won't handle subqueries; shouldn't need w/ a simple data model */
471     subquery:
472     '(' SELECT opt_all_distinct selection table_exp ')'
473     { printf("Subquery not handled\n"); glb_errflag = 1; }
474     ;
475    
476    
477     /* scalar expressions */
478     scalar_exp:
479     scalar_exp '+' scalar_exp {
480     strcpy($$, $1);
481     strcat($$, ","); /* use comma's for spaces because of obj_srvr.pm */
482     strcat($$, $2);
483     strcat($$, ",");
484     strcat($$, $3);
485     }
486     | scalar_exp '-' scalar_exp {
487     strcpy($$, $1);
488     strcat($$, ","); /* use comma's for spaces because of obj_srvr.pm */
489     strcat($$, $2);
490     strcat($$, ",");
491     strcat($$, $3);
492     }
493     | scalar_exp '*' scalar_exp {
494     strcpy($$, $1);
495     strcat($$, ","); /* use comma's for spaces because of obj_srvr.pm */
496     strcat($$, $2);
497     strcat($$, ",");
498     strcat($$, $3);
499     }
500     | scalar_exp '/' scalar_exp {
501     strcpy($$, $1);
502     strcat($$, ","); /* use comma's for spaces because of obj_srvr.pm */
503     strcat($$, $2);
504     strcat($$, ",");
505     strcat($$, $3);
506     }
507     | '+' scalar_exp %prec UMINUS { /* jhjh - what is this */
508     strcpy($$, $1);
509     strcat($$, ",");
510     strcat($$, $2);
511     }
512     | '-' scalar_exp %prec UMINUS { /* jhjh - what is this */
513     strcpy($$, $1);
514     strcat($$, ",");
515     strcat($$, $2);
516     }
517     | atom /* jhjh - ignore multi-word possibilities here */
518     | column_ref
519     | function_ref /* jhjh - ignore functions */
520     | '(' scalar_exp ')' {
521     strcpy($$, $1);
522     strcat($$, ","); /* use comma's for spaces because of obj_srvr.pm */
523     strcat($$, $2);
524     strcat($$, ",");
525     strcat($$, $3);
526     }
527     ;
528    
529     scalar_exp_commalist:
530     scalar_exp
531     | scalar_exp_commalist ',' scalar_exp {
532     strcpy($$, $1);
533     strcat($$, ",");
534     strcat($$, $3);
535     }
536     ;
537     atom:
538     parameter_ref
539     | literal
540     | USER
541     ;
542    
543     parameter_ref:
544     parameter
545     | parameter parameter
546     | parameter INDICATOR parameter
547     ;
548    
549     function_ref:
550     AMMSC '(' '*' ')'
551     | AMMSC '(' DISTINCT column_ref ')'
552     | AMMSC '(' ALL scalar_exp ')'
553     | AMMSC '(' scalar_exp ')'
554     ;
555    
556     literal:
557     STRING
558     | INTNUM
559     | APPROXNUM
560     ;
561    
562    
563     /* miscellaneous */
564     table:
565     NAME
566    
567     | NAME '.' NAME
568     ;
569    
570     column_ref:
571     INTNUM
572     | NAME
573     | NAME '.' NAME { strcpy($$, $3) }
574     | NAME '.' NAME '.' NAME
575     | column_ref NAME {
576     printf("Multiple-table query not handled\n"); glb_errflag = 1;
577     }
578     ;
579    
580    
581     /* the various things you can name */
582     column:
583     NAME
584     ;
585    
586     cursor:
587     NAME
588     ;
589    
590     parameter:
591     PARAMETER /* :name handled in parser */
592     ;
593    
594     range_variable:
595     NAME {
596     printf("Table alias not handled\n"); glb_errflag = 1;
597     }
598     ;
599    
600     user:
601     NAME
602     ;
603    
604    
605     /* embedded condition things */
606     sql:
607     WHENEVER NOT FOUND when_action
608     | WHENEVER SQLERROR when_action
609     ;
610    
611     when_action:
612     GOTO NAME
613     | CONTINUE
614     ;
615    
616     %%
617    

  ViewVC Help
Powered by ViewVC 1.1.26