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 |
|