Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libGDBMS / grammar / oracle.jj @ 466

History | View | Annotate | Download (24 KB)

1
/***********************************************************************
2
 * Token definitions
3
 ***********************************************************************/
4

    
5
/* There may be tokens here which don't relate to SQL, but we needed for
6
   the rest of our project [Kevin] */ 
7

    
8
SKIP:
9
{
10
    " "
11
  | "\n"
12
  | "\r"
13
  | "\t"
14
}
15

    
16

    
17
SKIP:
18
{
19
  <COMMENT_LINE: "--" (~["\n","\r"])* ("\n"|"\r"|"\r\n") >
20
        { 
21
          SC.addComment(SC.fout.printBlock("//" + image.toString().substring(2)));
22
        }
23
}
24

    
25

    
26
SKIP:
27
{
28
  <COMMENT_BLOCK: "/*" (~["*"])* "*" ("*" | (~["*","/"] (~["*"])* "*"))* "/">
29
        { 
30
	  SC.addComment(SC.fout.printBlock(image.toString()) + SC.fout.println()); 
31
	}
32
}
33

    
34

    
35
TOKEN:  /* Keywords */
36
{
37
    < ALL: "all" >
38
  | < AND: "and" >
39
  | < ASC: "asc" >
40
  | < BEGIN: "begin" >
41
  | < BETWEEN: "between" >
42
  | < BOOLEAN: "boolean" >
43
  | < BY: "by" >
44
  | < CHAR: "char" >
45
  | < CHARACTER: "character" >
46
  | < CONSTANT: "constant" >
47
  | < CURSOR: "cursor" >
48
  | < DESC: "desc" >
49
  | < DISTINCT: "distinct" >
50
  | < ELSE: "else" >
51
  | < ELSIF : "elsif" >
52
  | < END: "end" >
53
  | < FROM: "from" >
54
  | < GROUP: "group" >
55
  | < HAVING: "having" >
56
  | < IF: "if" >
57
  | < INTEGER: "integer" >
58
  | < IN: "in" >
59
  | < IS: "is" >
60
  | < LIKE: "like" >
61
  | < MAX: "max" >
62
  | < MIN: "min" >
63
  | < NOT: "not" >
64
  | < NULL: "null" >
65
  | < NUMBER: "number" >
66
  | < OR: "or" >
67
  | < ORDER: "order" >
68
  | < PROCEDURE: "procedure" >
69
  | < RECORD: "record" >
70
  | < SELECT: "select" >
71
  | < SMALLINT: "smallint" >
72
  | < SPACES: "spaces" >
73
  | < SUBSTR: "substr" >
74
  | < SUM: "sum" >
75
  | < THEN: "then" >
76
  | < TYPE: "type" >
77
  | < USER: "user" >
78
  | < UPPER: "upper" >
79
  | < VARCHAR2: "varchar2" >
80
  | < WHERE: "where" >
81
  | < ZERO: "zero" >
82
  | < ZEROS: "zeros" >
83

    
84
//***************************************************************************************
85
  | < COUNT: "count" >
86
  | < CLOSE: "close" >
87
  | < CONVERT_TIMESTAMP_TO_DATE: "ConvertTimeStampToDate" >
88
  | < DELETE: "delete" >
89
  | < EXISTS: "exists" >
90
  | < EXIT: "exit" >
91
  | < EXCEPTION: "exception" >
92
  | < FETCH: "fetch" >
93
  | < FOR: "for" >
94
  | < FORMAT_AUDIT_HEADER: "FormatAuditHeader" >
95
  | < FORMAT_ATTRIBUTE_SUBSTRING: "FormatAttributeSubString" >
96
  | < GET_CURRENT_TIMESTAMP: "GetCurrentTimeStamp" >
97
  | < INSERT: "insert" >
98
  | < INTO: "into" >
99
  | < INDEX_BY: "index by binary_integer" >
100
  | < IS_TABLE_OF: "is table of" >
101
  | < LENGTH: "length" >
102
  | < LOOP: "loop" >
103
  | < LPAD: "lpad" >
104
  | < LTRIM: "ltrim" >
105
  | < REPLACE: "replace" >
106
  | < RTRIM: "rtrim" >
107
  | < NODULE: "nodule" >
108
  | < NOTFOUND: "%notFound" >
109
  | < OPEN: "open" >
110
  | < OTHERS: "others" >
111
  | < ORIGINPLUS: "originplus" >
112
  | < REPLY: "reply" >
113
  | < REPLY_REPEATING_GROUP: "replyRepeatingGroup" >
114
  | < REQUEST: "request" >
115
  | < ROW_NOT_FOUND: "row_not_found" >
116
  | < SET: "set" >
117
  | < SQL_I_O_CORRECT: "sql_I_O_Correct" >
118
  | < TO_CHAR: "to_char" >
119
  | < TO_NUMBER: "to_number" >
120
  | < UPDATE: "update" >
121
  | < VALUES: "values" >
122
  | < WHEN: "when" >
123
  | < WHILE: "while" >
124
}     
125

    
126

    
127
TOKEN:
128
{
129
    < NO_DATA_FOUND: "NO_DATA_FOUND" >
130
  | < TABLE_STATUS: "TABLE_STATUS" >
131
  | < SQLCODE: "SQLCode" >
132
  | < SET_ROW_NOT_FOUND: "Set_Row_Not_Found" >
133
  | < FILE_NAME_OF_ERROR_AREA: "FILE_NAME_OF_ERROR_AREA" >
134
  | < KEY_IN_ERROR: "KEY_IN_ERROR" >
135
  | < ERROR_DETAIL_DESCRIPTION: "ERROR_DETAIL_DESCRIPTION" >
136
  | < SETUPFATALERROR: "SetupFatalError" >
137
}
138

    
139
<DESCRIPTION_START_STATE> TOKEN:
140
{
141
    < OPENDESCRIPTION: "\r\n" > : DESCRIPTION_STATE
142
}
143

    
144

    
145
<DESCRIPTION_STATE> TOKEN:  /* Line */
146
{
147
    < CLOSEDESCRIPTION: "~" > : DEFAULT
148
  | < DESCRIPTION: (~["~"])* "~" > : DEFAULT
149
}
150

    
151
 
152
TOKEN:  /* Literals */
153
{
154
    < INTEGER_LITERAL: (["0"-"9"])+ >
155
  | < FLOATING_POINT_LITERAL:
156
          (["0"-"9"])+ "." (["0"-"9"])+ (<EXPONENT>)?
157
        | "." (["0"-"9"])+ (<EXPONENT>)?
158
        | (["0"-"9"])+ <EXPONENT>
159
        | (["0"-"9"])+ (<EXPONENT>)?
160
    >
161
  | < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
162
  | < STRING_LITERAL: "'" (~["'"])* ( "''" (~["'"])* )* "'" >
163
}
164

    
165

    
166
TOKEN:  /* Identifiers */
167
{
168
    < ID: ( <LETTER> )+ ( "_" | "$" | "#" | <DIGIT> | <LETTER> )* >
169
  | < #LETTER: ["A"-"Z", "a"-"z"] >
170
  | < #DIGIT: ["0"-"9"] >
171
}
172

    
173

    
174
TOKEN:  /* Separators and operators */
175
{
176
    < ASSIGN: ":=" >
177
  | < CONCAT: "||" >
178
  | < SEMICOLON: ";" >
179
  | < DOT: "." >
180
  | < ROWTYPE: "%ROWTYPE" >
181
  | < TILDE: "~" >
182
  | < LESS: "<" >
183
  | < LESSEQUAL: "<=" >
184
  | < GREATER: ">" >
185
  | < GREATEREQUAL: ">=" >
186
  | < EQUAL: "=" >
187
  | < NOTEQUAL: "!=" >
188
  | < NOTEQUAL2: "<>" >
189
  | < JOINPLUS: "(+)" >
190
  | < OPENPAREN: "(" >
191
  | < CLOSEPAREN: ")" >
192
  | < ASTERISK: "*" >
193
  | < SLASH: "/" >
194
  | < PLUS: "+" >
195
  | < MINUS: "-" >
196
  | < QUESTIONMARK: "?" >
197
  | <COMPARISON: <LESS>
198
       | <LESSEQUAL>
199
       | <GREATER>
200
       | <GREATEREQUAL>
201
       | <EQUAL>
202
       | <NOTEQUAL>
203
       | <NOTEQUAL2>
204
    >
205
}
206

    
207

    
208

    
209
/*******************************************************************
210
 * The PL-SQL grammar starts here
211
 *******************************************************************/
212

    
213
String SQLAndExpr() :
214
{ String rs = new String(""), ts; }
215
{
216
  ts = SQLNotExpr() { rs = rs + ts; }
217
  ( <AND> 
218
	{ rs = rs + fout.println();
219
	  rs = rs + fout.printRj("AND ");
220
        }
221
    ts = SQLNotExpr() { rs = rs + ts; })*
222
	{ return rs; }
223
}
224

    
225
String SQLBetweenClause() :
226
{ String rs = new String(""), ts; }
227
{
228
  [ <NOT> { rs = rs + fout.print(" NOT"); } ]
229
  <BETWEEN> { rs = rs + fout.print(" BETWEEN "); }
230
  ts = SQLSumExpr() { rs = rs + ts; }
231
  <AND> { rs = rs + fout.print(" AND "); }
232
  ts = SQLSumExpr() { rs = rs + ts; }
233
  { return rs; }
234
}
235

    
236
String SQLColRef() :
237
{Token aliasName, columnName;
238
 String s, rs = new String("");
239
}
240
{
241
  s = SQLLvalue()
242
	{ rs = rs + fout.print(s); return rs; }
243
}
244

    
245
String SQLCompareExpr() :
246
{ 
247
  String rs = new String(""), ts;
248
}
249
{
250
  (
251
    LOOKAHEAD (SQLSelect()) ts = SQLSelect() { rs = rs + ts; }
252
  | LOOKAHEAD (SQLColRef() <IS>) ts = SQLIsClause() { rs = rs + ts; }
253
  | LOOKAHEAD (<EXISTS>) ts = SQLExistsClause() { rs = rs + ts; }
254
  | ts = SQLSumExpr() { rs = rs + ts; } [ ts = SQLCompareExprRight() { rs = rs + ts; } ] 
255
  )
256
  { return rs; }
257
}
258

    
259
String SQLCompareExprRight() :
260
{ String rs = new String(""), ts; }
261
{
262
  (
263
    LOOKAHEAD(2) ts = SQLLikeClause() { rs = rs + ts; }
264
  | LOOKAHEAD(2) ts = SQLInClause() { rs = rs + ts; }
265
  | ts = SQLLeftJoinClause() { rs = rs + ts; }
266
  | LOOKAHEAD(SQLCompareOp() SQLSumExpr() "(+)") ts = SQLRightJoinClause() { rs = rs + ts; }
267
  | LOOKAHEAD(2) ts = SQLBetweenClause() { rs = rs + ts; }
268
  | ts = SQLCompareOp() { rs = rs + ts; }
269
    ts = SQLSumExpr() { rs = rs + ts; }
270
  )
271
	{ return rs; }
272
}
273

    
274
String SQLCompareOp() :
275
{ String rs = new String("");}
276
{
277
  (
278
    <EQUAL>	   { rs = rs + fout.print(" = "); }
279
  | <NOTEQUAL>     { rs = rs + fout.print(" != "); }
280
  | <NOTEQUAL2>    { rs = rs + fout.print(" != "); }
281
  | <GREATER>      { rs = rs + fout.print(" > "); }
282
  | <GREATEREQUAL> { rs = rs + fout.print(" >= "); }
283
  | <LESS>         { rs = rs + fout.print(" < "); }
284
  | <LESSEQUAL>    { rs = rs + fout.print(" <= "); }
285
  )
286
  { return rs; }
287
}
288

    
289
String SQLCursorArgs() :
290
{ String rs = new String(""), ts; }
291
{
292
  "(" 
293
  [ ( SQLColRef() [ SQLDataType() ] | SQLFunction() )
294
    ( "," ( SQLColRef() [ SQLDataType() ] | SQLFunction() ) )*
295
  ]
296
  ")" { return rs; }
297
}
298

    
299
String SQLCursorClose() :
300
{ Token cursorName;
301
  String rs = new String("");
302
}
303
{
304
  <CLOSE> cursorName = <ID>  
305
	{
306
	  rs = rs + fout.print("Exec SQL Close ");
307
	  rs = rs + fout.print(TitleCaseString.fixCase(cursorName.image));
308
	}
309
  { return rs; }
310
}
311

    
312
void SQLCursorDeclare() :
313
{Token x, y;
314
 String rs = new String(""), ts;
315
}
316
{
317
  "cursor" x = <ID>
318
        { fout.indent();
319
          rs = rs + fout.println("EXEC SQL");
320
          fout.indent();
321
          rs = rs + fout.print("Declare ");
322
          String s = TitleCaseString.fixCase(x.image);
323
          rs = rs + fout.print(s);
324
          rs = rs + fout.println(" Cursor For");
325
          fout.indent();
326
        }
327
  [ ts = SQLCursorArgs() { rs = rs + fout.println(); } ]
328
//  [ ts = SQLFunctionArgs() { rs = rs + ts; } ]
329
  "is" ts = SQLSelect() ";"
330
        {
331
		  rs = rs + fout.print(ts); 
332
          rs = rs + fout.println(";");
333
          fout.outdent();
334
          fout.outdent();
335
          fout.outdent();
336
		  out.print(rs);
337
        }
338
}
339

    
340
String SQLCursorFetch() :
341
{ String rs = new String(""), ts;}
342
{
343
  <FETCH>
344
        {
345
	    rs = rs + fout.print("Exec SQL FETCH ");
346
	    fout.align();
347
	    inSelect = true;
348
        }
349
  ts = SQLSelectCols()
350
	{
351
	  rs = rs + ts;
352
	  inSelect = false; 
353
	}
354
  [ <INTO>
355
        {
356
	  inSQL = true;
357
	  rs = rs + fout.println();
358
          rs = rs + fout.printRj("INTO ");
359
        }
360
    ts = SQLSelectCols()
361
        {
362
	  rs = rs + ts;
363
	  fout.outalign();
364
        }
365
  ]
366
	{ inSQL = false ; return rs; }
367
}
368

    
369
String SQLCursorOpen() :
370
{ Token cursorName;
371
  String rs = new String(""), ts;
372
}
373
{
374
  <OPEN> cursorName = <ID>  
375
	{
376
	  rs = rs + fout.print("Exec SQL Open ");
377
	  rs = rs + fout.print(TitleCaseString.fixCase(cursorName.image));
378
	}
379
  [ ts = SQLCursorArgs() ]
380
  { return rs; }
381
}
382

    
383
DataType SQLDataType() :
384
{Token x;
385
 int size = 0;
386
}
387
{
388
    "integer"
389
        { return new IntegerDataType(); }
390
  | "smallint"
391
        { return new IntegerDataType(); }
392
  | "number" { size = 0; }
393
             [ "(" x = <INTEGER_LITERAL> ")" { size = Integer.valueOf(x.image).intValue(); } ]
394
        { return new NumberDataType(size); }
395
  | ("char" | "character") { size = 1; }
396
             [ "(" x = <INTEGER_LITERAL> ")" { size = Integer.valueOf(x.image).intValue(); } ]
397
        { return new CharDataType(size); }
398
  | "varchar2" { size = 1; }
399
             [ "(" x = <INTEGER_LITERAL> ")" { size = Integer.valueOf(x.image).intValue(); } ]
400
        { return new CharDataType(size); }
401
  | "boolean"
402
        { return new BooleanDataType(); }
403
}
404

    
405
String SQLDelete() :
406
{ String rs = new String(""), ts; }
407
{
408
  <DELETE> <FROM>
409
        { 
410
	  if (inProcedure) rs = rs + fout.print("Exec SQL ");
411
	  rs = rs + fout.print("DELETE FROM ");
412
          fout.align();
413
	  inSQL = true;
414
        }
415
  ts = SQLTableList() { rs = rs + ts; }
416
  [ ts = SQLWhere() { rs = rs + ts; } ]
417
        { fout.outalign();
418
	  inSQL = false;
419
	}
420
  { return rs; }
421
}
422

    
423
String SQLExistsClause() :
424
{ String rs = new String(""), ts; }
425
{
426
  <EXISTS> 
427
	{
428
	  rs = rs + fout.print("EXISTS (");
429
	  fout.align();
430
	}
431
  "(" ts = SQLSelect() { rs = rs + ts; } ")"
432
	{
433
	  rs = rs + fout.print(")");
434
	  fout.outalign();
435
	  return rs;
436
	}
437
}
438

    
439
String SQLFunction() :
440
{ Token otherFunction;
441
  String rs = new String(""), ts;
442
}
443
{
444
  ( <UPPER> { rs = rs + fout.print("UPPER"); }
445
    ts = SQLFunctionArgs() { rs = rs + ts; }
446
  | <MAX> { rs = rs + fout.print("MAX"); }
447
    ts = SQLFunctionArgs() { rs = rs + ts; }
448
  | <MIN> { rs = rs + fout.print("MIN"); }
449
    ts = SQLFunctionArgs() { rs = rs + ts; }
450
  | <SUM> { rs = rs + fout.print("SUM"); }
451
    ts = SQLFunctionArgs() { rs = rs + ts; }
452
  | <COUNT> { rs = rs + fout.print("COUNT"); }
453
    ts = SQLFunctionArgs() { rs = rs + ts; }
454
  | <LPAD> { rs = rs + fout.print("<<<LPAD>>>"); }
455
    ts = SQLFunctionArgs() { rs = rs + ts; }
456
  | <LTRIM> { rs = rs + fout.print("<<<LTRIM>>>"); }
457
    ts = SQLFunctionArgs() { rs = rs + ts; }
458
  | <RTRIM> { rs = rs + fout.print("<<<RTRIM>>>"); }
459
    ts = SQLFunctionArgs() { rs = rs + ts; }
460
  | <LENGTH> { rs = rs + fout.print("<<<LENGTH>>>"); }
461
    ts = SQLFunctionArgs() { rs = rs + ts; }
462
  | <REPLACE> { rs = rs + fout.print("<<<REPLACE>>>"); }
463
    ts = SQLFunctionArgs() { rs = rs + ts; }
464
  | <SUBSTR> { rs = rs + fout.print(" <<<SUBSTR>>> "); }
465
    ts = SQLFunctionArgs() { rs = rs + ts; }
466
  | <TO_CHAR> { rs = rs + fout.print(" <<<TO_CHAR>>> "); }
467
    ts = SQLFunctionArgs() { rs = rs + ts; }
468
  | <TO_NUMBER> { rs = rs + fout.print(" <<<TO_NUMBER>>> "); }
469
    ts = SQLFunctionArgs() { rs = rs + ts; }
470
  | LOOKAHEAD(3) <ORIGINPLUS> <DOT> <CONVERT_TIMESTAMP_TO_DATE> { rs = rs + fout.print(" <<<ORIGINPLUS.ConvertTimeStampToDate>>> "); }
471
    ts = SQLFunctionArgs() { rs = rs + ts; }
472
  | LOOKAHEAD(3) <ORIGINPLUS> <DOT> <FORMAT_AUDIT_HEADER> { rs = rs + fout.print(" <<<ORIGINPLUS.FormatAuditHeaderString>>> "); }
473
    ts = SQLFunctionArgs() { rs = rs + ts; }
474
  | LOOKAHEAD(3) <ORIGINPLUS> <DOT> <FORMAT_ATTRIBUTE_SUBSTRING> { rs = rs + fout.print(" <<<ORIGINPLUS.FormatAttributeSubString>>> "); }
475
    ts = SQLFunctionArgs() { rs = rs + ts; }
476
  | LOOKAHEAD(3) <ORIGINPLUS> <DOT> <GET_CURRENT_TIMESTAMP> { rs = rs + fout.print(" <<<ORIGINPLUS.GetCurrentTimeStamp>>> "); }
477
  | LOOKAHEAD (<ID> "(") otherFunction = <ID> 
478
	{ 
479
	  rs = rs + fout.print("<<<");
480
	  rs = rs + fout.print(otherFunction.image);
481
	  rs = rs + fout.print(">>>");
482
	}
483
    ts = SQLFunctionArgs() { rs = rs + ts; }
484
  )
485
  { return rs; }
486
}
487

    
488
String SQLFunctionArgs() :
489
{ String rs = new String(""), ts; }
490
{
491
  "(" { rs = rs + fout.print("("); }
492
  [ ts = SQLSumExpr() { rs = rs + ts; }
493
    ( "," { rs = rs + fout.print(", "); }
494
          ts = SQLSumExpr() { rs = rs + ts; } )*
495
  ]
496
  ")" { rs = rs + fout.print(")"); return rs; }
497
}
498

    
499
String SQLGroupBy() :
500
{ String rs = new String(""), ts; }
501
{
502
  <GROUP> <BY> { rs = rs + fout.println();
503
                 rs = rs + fout.printRj("GROUP ");
504
                 rs = rs + fout.print("BY ");
505
               }
506
  ts = SQLOrderByList() { rs = rs + ts; }
507
  { return rs; }
508
}
509

    
510
String SQLInClause() :
511
{ String rs = new String(""), ts; }
512
{
513
  [ <NOT> { rs = rs + fout.print(" NOT"); } ]
514
  <IN> { rs = rs + fout.print(" IN "); }
515
  "(" { rs = rs + fout.print("("); }
516
  ts = SQLLValueList() { rs = rs + ts; }
517
  ")" { rs = rs + fout.print(")"); }
518
  { return rs; }
519
}
520

    
521
String SQLInsert() :
522
{ String rs = new String(""), ts; }
523
{
524
  <INSERT> <INTO> 
525
        { 
526
	    if (inProcedure) rs = rs + fout.print("Exec SQL ");
527
	    rs = rs + fout.print("INSERT INTO ");
528
          fout.align();
529
        }
530
  ts = SQLTableList() { rs = rs + ts; }
531
  [
532
    "(" 
533
	{
534
	  rs = rs + fout.print("(");
535
	  inSelect = true;
536
	} 
537
    ts = SQLSelectCols() { rs = rs + ts; }
538
    ")" 
539
	{ 
540
	  rs = rs + fout.print(")");
541
	  inSelect = false;
542
	}
543
    <VALUES> 
544
	{ 
545
	  rs = rs + fout.print(") VALUES");
546
	}
547
  ]
548
  "("
549
	{ 
550
	  rs = rs + fout.print(" (");
551
	  inSQL = true;
552
	}
553
  ts = SQLSelectCols() { rs = rs + ts; }
554
  ")"
555
	{ 
556
	  rs = rs + fout.print(")");
557
	  inSelect = false;
558
        fout.outalign();
559
	  return rs;
560
	}
561
}
562

    
563
String SQLIsClause() :
564
{ String rs = new String(""), ts; }
565
{
566
  ts = SQLColRef() { rs = rs + ts; }
567
  <IS> { rs = rs + fout.print(" IS"); }
568
  [ <NOT> { rs = rs + fout.print(" NOT"); } ]
569
  <NULL> { rs = rs + fout.print(" NULL"); }
570
  { return rs; }
571
}
572

    
573
String SQLLeftJoinClause() :
574
{ Token theComparison; 
575
  String rs = new String(""), ts;
576
}
577
{
578
  "(+)" ts = SQLCompareOp() 
579
	{
580
	  rs = rs + ts;
581
	  rs = rs + fout.print("* "); 
582
	}
583
  ts = SQLSumExpr() { rs = rs + ts; }
584
  { return rs; }
585
}
586

    
587
String SQLLikeClause() :
588
{ String rs = new String(""), ts;}
589
{
590
  [ <NOT> { rs = rs + fout.print(" NOT"); } ]
591
  <LIKE> { rs = rs + fout.print(" LIKE "); }
592
  ts = SQLPattern() { rs = rs + ts; }
593
  { return rs; }
594
}
595

    
596
String SQLLiteral() :
597
{Token x;
598
 String rs = new String("");
599
}
600
{
601
  ( x = <STRING_LITERAL> { rs = rs + fout.print(x.image); }
602
  | x = <INTEGER_LITERAL> { rs = rs + fout.print(x.image); }
603
  | x = <FLOATING_POINT_LITERAL> { rs = rs + fout.print(x.image); }
604
  | (<ZEROS> | <ZERO>) { rs = rs + fout.print("0"); }
605
  | <SPACES> { rs = rs + fout.print("<<<SPACES>>>"); }
606
  | x = <ASTERISK> { rs = rs + fout.print(x.image); }
607
  )
608
  { return rs; }
609
}
610

    
611
String SQLLvalue() :
612
{ Token x, y;
613
  String s = new String(""), t;
614
}
615
{
616
  (
617
    <REQUEST> <DOT> 
618
	{
619
	  s = s + ":";
620
          s = s + "Request->";
621
        }
622
    t = SQLLvalueTerm()
623
	{
624
	  s = s + t;
625
	}
626
  | <REPLY_REPEATING_GROUP> <DOT>
627
	{
628
	  s = s + ":";
629
          s = s + "ReplyRepeatingGroup->";
630
        }
631
    t = SQLLvalueTerm()
632
	{
633
	  s = s + t;
634
	}
635
  | <REPLY> <DOT>
636
	{
637
	  s = s + ":";
638
          s = s + "Reply->";
639
        }
640
    t = SQLLvalueTerm()
641
	{
642
	  s = s + t;
643
	}
644
  | <SQL_I_O_CORRECT>
645
	{
646
          s = s + "SQL_I_O_CORRECT";
647
        }
648
  | <ROW_NOT_FOUND>
649
	{
650
          s = s + "ROW_NOT_FOUND";
651
        }
652
  |
653
    t = SQLLvalueTerm()
654
	{
655
	  s = s + t;
656
	}
657
  )
658
  	{ return s; }
659
}
660

    
661
String SQLLvalueTerm() :
662
{ Token x, y; 
663
  String s = new String("");
664
}
665
{
666
  x = <ID> 
667
	{
668
	  s = varList.nameOf(x.image);
669
// Change to :Pr_ and substring(4) after creating nameOfSql	  
670
	  if (s.startsWith("Pr_")) {
671
		s = ":Request->" + s.substring(3);
672
	  }
673
	}
674
  ( <DOT> y = <ID>
675
		{ 
676
		  s = s + ".";
677
		  s = s + TitleCaseString.fixCase(y.image);
678
		} 
679
  )*
680
	{ return s; }
681
}
682

    
683
String SQLNotExpr() :
684
{ String rs = new String(""), ts; }
685
{
686
  [ <NOT> 
687
	{ 
688
	  rs = rs + fout.print("NOT ");
689
	}
690
  ] 
691
  ts = SQLCompareExpr() 
692
	{
693
	  rs = rs + ts;
694
	  return rs; 
695
	}
696
}
697

    
698
String SQLOrderBy() :
699
{ String rs = new String(""), ts; }
700
{
701
  <ORDER> <BY> { rs = rs + fout.println();
702
                 rs = rs + fout.printRj("ORDER ");
703
                 rs = rs + fout.print("BY ");
704
               }
705
  ts = SQLOrderByList() { rs = rs + ts; }
706
  { return rs; }
707
}
708

    
709
String SQLOrderByElem() :
710
{ String rs = new String(""), ts; }
711
{
712
  ts = SQLColRef() { rs = rs + ts; }
713
  [ ts = SQLOrderDirection() { rs = rs + ts; } ]
714
  { return rs; }
715
}
716

    
717
String SQLOrderByList() :
718
{ String rs = new String(""), ts; }
719
{
720
  ts = SQLOrderByElem() { rs = rs + ts; }
721
  ( LOOKAHEAD(2)
722
    "," { rs = rs + fout.println(", "); }
723
    ts = SQLOrderByElem() { rs = rs + ts; })*
724
  { return rs; }
725
}
726

    
727
String SQLOrderDirection() :
728
{ String rs = new String(""); }
729
{
730
  (
731
    <ASC> { rs = rs + fout.print(" ASC"); }
732
  | <DESC> { rs = rs + fout.print(" DESC"); }
733
  )
734
  { return rs; }
735
}
736

    
737
String SQLOrExpr() :
738
{ String rs = new String(""), ts;}
739
{
740
  ts = SQLAndExpr() { rs = rs + ts; }
741
  ( <OR> 
742
	{
743
	  rs = rs + fout.println();
744
	  rs = rs + fout.printRj("OR "); 
745
        }
746
    ts = SQLAndExpr() { rs = rs + ts; })* 
747
  { return rs; }
748
}
749

    
750
String SQLPattern() :
751
{Token x;
752
 String rs = new String(""), ts;
753
}
754
{
755
  ( x = <STRING_LITERAL> { rs = rs + fout.print(x.image); }
756
  | "?" { rs = rs + fout.print("?"); }
757
  | <USER> { rs = rs + fout.print("USER"); }
758
  | ts = SQLLvalue() { rs = rs + ts; }
759
  )
760
  { return rs; }
761
}
762

    
763
String SQLProductExpr() :
764
{ String rs = new String(""), ts;}
765
{
766
  ts = SQLUnaryExpr() { rs = rs + ts; }
767
  ( ( "*" { rs = rs + fout.print(" * "); }
768
    | "/" { rs = rs + fout.print(" / "); }
769
    ) ts = SQLUnaryExpr() { rs = rs + ts; } )*
770
  { return rs; }
771
}
772

    
773
String SQLRightJoinClause() :
774
{ Token theComparison; 
775
  String rs = new String(""), ts;
776
}
777
{
778
  { rs = rs + fout.print("*"); }
779
  ts = SQLCompareOp() { rs = rs + ts; }
780
  ts = SQLSumExpr() { rs = rs + ts; }
781
  "(+)"
782
  { return rs; }
783
}
784

    
785
String SQLSelect() :
786
{ String rs = new String(""), ts; }
787
{
788
  <SELECT>
789
        { 
790
	  if (inProcedure) rs = rs + fout.print("Exec SQL ");
791
	  rs = rs + fout.print("SELECT ");
792
	  fout.align();
793
	  inSelect = true;
794
        }
795
  ts = SQLSelectCols()
796
	{ rs = rs + ts; inSelect = false; }
797
  [ <INTO>
798
        { rs = rs + fout.println();
799
          rs = rs + fout.printRj("INTO ");
800
	  inSQL = true;
801
        }
802
    ts = SQLSelectCols()
803
	{ rs = rs + ts; inSQL = false; }
804
  ]
805
  <FROM>
806
        { rs = rs + fout.println();
807
          rs = rs + fout.printRj("FROM ");
808
        }
809
  ts = SQLTableList() { rs = rs + ts; }
810
  [ ts = SQLWhere()   { rs = rs + ts; } ]
811
  [ ts = SQLGroupBy() { rs = rs + ts; } ]
812
  [ ts = SQLOrderBy() { rs = rs + ts; } ]
813
        { 
814
	  fout.outalign();
815
	  return rs;
816
	}
817
}
818

    
819
String SQLSelectCols() :
820
{ String rs = new String(""), ts;}
821
{
822
  ( <ALL> { rs = rs + fout.print("ALL "); }
823
  | <DISTINCT> { rs = rs + fout.print("DISTINCT "); }
824
  )* [ "*" { rs = rs + fout.print("*"); } | ts = SQLSelectList() { rs = rs + ts; } ]
825
  { return rs; }
826
}
827

    
828
String SQLSelectList() :
829
{ String rs = new String(""), ts; }
830
{
831
  ts = SQLSumExpr() { rs = rs + ts; }
832
  ( ","
833
        { rs = rs + fout.println();
834
          rs = rs + fout.printRj(", ");
835
        }
836
    ts = SQLSumExpr() { rs = rs + ts; })*
837
  { return rs; }
838
}
839

    
840
String SQLStatement() :
841
{ String rs = new String(""), ts; }
842
{
843
  ( 
844
    ts = SQLSelect() { rs = rs + ts; }
845
  | ts = SQLInsert() { rs = rs + ts; }
846
  | ts = SQLUpdate() { rs = rs + ts; }
847
  | ts = SQLDelete() { rs = rs + ts; }
848
  | ts = SQLCursorOpen() { rs = rs + ts; }
849
  | ts = SQLCursorFetch() { rs = rs + ts; }
850
  | ts = SQLCursorClose() { rs = rs + ts; }
851
  ) ";"
852
	{
853
	  rs = rs + fout.println(";") ;
854
	  return rs;
855
	}
856
}
857

    
858
String SQLSumExpr() :
859
{ String rs = new String(""), ts; }
860
{
861
    ts = SQLProductExpr() { rs = rs + ts; }
862
     ( LOOKAHEAD(2) ( "+" { rs = rs + fout.print(" + "); }
863
                    | "-" { rs = rs + fout.print(" - "); }
864
                    | "||" { rs = rs + fout.print(" + "); }
865
                    ) ts = SQLProductExpr() { rs = rs + ts; } )*
866
  { return rs; }
867
}
868

    
869
String SQLTableList() :
870
{ String rs = new String(""), ts; }
871
{
872
  ts = SQLTableRef() { rs = rs + ts; }
873
  ( LOOKAHEAD(2) "," { rs = rs + fout.println(", "); }
874
                                ts = SQLTableRef() { rs = rs + ts; } )*
875
  { return rs; }
876
}
877

    
878

    
879
String SQLTableRef() :
880
{Token tableName, aliasName;
881
 String rs = new String("");
882
}
883
{
884
  tableName = <ID>
885
        { rs = rs + fout.print(TitleCaseString.fixCase(tableName.image));
886
        }
887
  [ aliasName = <ID>
888
        { rs = rs + fout.print(" ");
889
          rs = rs + fout.print(TitleCaseString.fixCase(aliasName.image));
890
        }
891
  ]
892
  { return rs; }
893
}
894

    
895
String SQLTerm() :
896
{ Token other; 
897
  String rs = new String(""), ts;
898
}
899
{
900
  (
901
    "(" { rs = rs + fout.print("(");
902
          fout.align();
903
        }
904
    ts = SQLOrExpr() { rs = rs + ts; }
905
    ")" { rs = rs + fout.print(")");
906
          fout.outalign();
907
        }
908
  | ts = SQLColRef() { rs = rs + ts; }
909
  | ts = SQLLiteral() { rs = rs + ts; }
910
  | ts = SQLFunction() { rs = rs + ts; }
911
//  | (other = <ID> { rs = rs + fout.print("<<<" + other.image + ">>>"); })+
912
  )
913
  { return rs; }
914
}
915

    
916
String SQLUnaryExpr() :
917
{ String rs = new String(""), ts; }
918
{
919
  [ ( "+" { rs = rs + fout.print("+"); }
920
    | "-" { rs = rs + fout.print("-"); }
921
    )
922
  ] ts = SQLTerm() { rs = rs + ts; }
923
  { return rs; }
924
}
925

    
926
String SQLUpdate() :
927
{ String rs = new String(""), ts; }
928
{
929
  <UPDATE>
930
        { 
931
	  if (inProcedure) rs = rs + fout.print("Exec SQL ");
932
	  rs = rs + fout.print("UPDATE ");
933
          fout.align();
934
        }
935
  ts = SQLTableList() { rs = rs + ts; }
936
  <SET>
937
        { 
938
	  inSQL = true;
939
	  rs = rs + fout.println();
940
	  rs = rs + fout.printRj("SET ");
941
        }
942
  ( 
943
    LOOKAHEAD(SQLLvalue() "=") ts = SQLUpdateAssignment() { rs = rs + ts; } 
944
    [
945
      ","
946
	{ 
947
	  rs = rs + fout.println();
948
	  rs = rs + fout.printRj(", ");
949
        }
950
    ] 
951
  )+
952

    
953
  [ ts = SQLWhere() { rs = rs + ts; } ]
954
        { fout.outalign();
955
	  inSQL = false;
956
	}
957
  { return rs; }
958
}
959

    
960
String SQLUpdateAssignment() :
961
{ String s, rs = new String(""), ts; }
962
{
963
  s = SQLLvalue() "="
964
  {
965
    rs = rs + fout.print(s);
966
    rs = rs + fout.print(" = ");
967
  }
968
  (
969
      LOOKAHEAD(SQLTerm() <CONCAT> ) { rs = rs + fout.print(" <<<CONCAT>>> "); } 
970
      ts = SQLTerm() { rs = rs + ts; } 
971
      ( <CONCAT> { rs = rs + fout.print(", "); } 
972
        ts = SQLTerm() { rs = rs + ts; } )+
973
      | ts = SQLSumExpr() { rs = rs + ts; } )
974
  { return rs; }
975
}
976

    
977
String SQLLValueElement() :
978
{ String rs = new String(""), ts; }
979
{
980
  ( <NULL> { rs = rs + fout.print("NULL"); }
981
  | ts = SQLSumExpr() { rs = rs + ts; }
982
  | ts = SQLSelect() { rs = rs + ts; } )
983
  { return rs; }
984
}
985

    
986
String SQLLValueList() :
987
{ String rs = new String(""), ts; }
988
{
989
  ts = SQLLValueElement() { rs = rs + ts; } 
990
  ( "," 
991
	{
992
	  rs = rs + fout.println();
993
	  rs = rs + fout.print(", ");
994
	}
995
    ts = SQLLValueElement() { rs = rs + ts; } 
996
  )*
997
  { return rs; }
998
}
999

    
1000
String SQLWhere() :
1001
{ String rs = new String(""), ts; }
1002
{
1003
  <WHERE> { rs = rs + fout.println();
1004
            rs = rs + fout.printRj("WHERE ");
1005
	    inSQL = true;
1006
          } ts = SQLOrExpr()
1007
	{ rs = rs + ts; inSQL = false; return rs; }
1008

    
1009
}
1010