1
/*****************************************************************************
3
* MODULE: SQL statement parser library
5
* AUTHOR(S): lex.l and yac.y were originaly taken from unixODBC and
6
* probably written by Peter Harvey <pharvey@codebydesigns.com>,
7
* modifications and other code by Radim Blazek
9
* PURPOSE: Parse input string containing SQL statement to
11
* SQL parser may be used by simple database drivers.
13
* COPYRIGHT: (C) 2000 by the GRASS Development Team
15
* This program is free software under the GNU General Public
16
* License (>=v2). Read the file COPYING that comes with GRASS
19
*****************************************************************************/
25
#include <grass/sqlp.h>
28
#define YYERROR_VERBOSE 1
47
%type <node> y_product
48
%type <node> y_expression
49
%type <node> y_comparison
50
%type <node> y_boolean
51
%type <node> y_sub_condition2
52
%type <node> y_sub_condition
53
%type <node> y_condition
55
/* literal keyword tokens */
56
%token <strval> COMPARISON_OPERATOR
58
%token <strval> STRING
59
%token <intval> INTNUM
60
%token <floatval> FLOATNUM
66
%token SELECT FROM WHERE
68
%token INSERT INTO VALUES
90
extern int yylex(void);
108
ALTER TABLE y_table ADD COLUMN y_columndef { sqpCommand(SQLP_ADD_COLUMN); }
109
| ALTER TABLE y_table ADD y_columndef { sqpCommand(SQLP_ADD_COLUMN); }
110
| ALTER TABLE y_table DROP COLUMN NAME { sqpCommand(SQLP_DROP_COLUMN); sqpColumn($6);}
114
CREATE TABLE y_table '(' y_columndefs ')' { sqpCommand(SQLP_CREATE); }
118
DROP TABLE y_table { sqpCommand(SQLP_DROP); }
122
SELECT y_columns FROM y_table { sqpCommand(SQLP_SELECT); }
123
| SELECT y_columns FROM y_table WHERE y_condition { sqpCommand(SQLP_SELECT); }
124
| SELECT y_columns FROM y_table ORDER BY y_order { sqpCommand(SQLP_SELECT); }
125
| SELECT y_columns FROM y_table WHERE y_condition ORDER BY y_order { sqpCommand(SQLP_SELECT); }
129
DELETE FROM y_table { sqpCommand(SQLP_DELETE); }
130
| DELETE FROM y_table WHERE y_condition { sqpCommand(SQLP_DELETE); }
134
INSERT INTO y_table y_values { sqpCommand(SQLP_INSERT); }
135
| INSERT INTO y_table '(' y_columns ')' y_values { sqpCommand(SQLP_INSERT); }
139
UPDATE y_table SET y_assignments { sqpCommand(SQLP_UPDATE); }
140
| UPDATE y_table SET y_assignments WHERE y_condition { sqpCommand(SQLP_UPDATE); }
146
| y_columndefs ',' y_columndef
150
NAME VARCHAR '(' INTNUM ')' { sqpColumnDef( $1, SQLP_VARCHAR, $4, 0 ); }
151
| NAME INT { sqpColumnDef( $1, SQLP_INTEGER, 0, 0 ); }
152
| NAME INTEGER { sqpColumnDef( $1, SQLP_INTEGER, 0, 0 ); }
153
| NAME DOUBLE { sqpColumnDef( $1, SQLP_DOUBLE, 0, 0 ); }
154
| NAME DOUBLE PRECISION { sqpColumnDef( $1, SQLP_DOUBLE, 0, 0 ); }
155
| NAME DATE { sqpColumnDef( $1, SQLP_DATE, 0, 0 ); }
156
| NAME TIME { sqpColumnDef( $1, SQLP_TIME, 0, 0 ); }
165
NAME { sqpColumn( $1 ); }
166
| y_column_list ',' NAME { sqpColumn( $3 ); }
170
NAME { sqpTable( $1 ); }
174
VALUES '(' y_value_list ')'
178
NULL_VALUE { sqpValue( NULL, 0, 0.0, SQLP_NULL ); }
179
| STRING { sqpValue( $1, 0, 0.0, SQLP_S ); }
180
| INTNUM { sqpValue( NULL, $1, 0.0, SQLP_I ); }
181
| '-' INTNUM { sqpValue( NULL, -$2, 0.0, SQLP_I ); }
182
| FLOATNUM { sqpValue( NULL, 0, $1, SQLP_D ); }
183
| '-' FLOATNUM { sqpValue( NULL, 0, -$2, SQLP_D ); }
184
| y_value_list ',' NULL_VALUE { sqpValue( NULL, 0, 0.0, SQLP_NULL ); }
185
| y_value_list ',' STRING { sqpValue( $3, 0, 0.0, SQLP_S ); }
186
| y_value_list ',' INTNUM { sqpValue( NULL, $3, 0.0, SQLP_I ); }
187
| y_value_list ',' '-' INTNUM { sqpValue( NULL, -$4, 0.0, SQLP_I ); }
188
| y_value_list ',' FLOATNUM { sqpValue( NULL, 0, $3, SQLP_D ); }
189
| y_value_list ',' '-' FLOATNUM { sqpValue( NULL, 0, -$4, SQLP_D ); }
194
| y_assignments ',' y_assignment
198
NAME EQUAL NULL_VALUE { sqpAssignment( $1, NULL, 0, 0.0, NULL, SQLP_NULL ); }
199
/* | NAME EQUAL STRING { sqpAssignment( $1, $3, 0, 0.0, NULL, SQLP_S ); }
200
| NAME EQUAL INTNUM { sqpAssignment( $1, NULL, $3, 0.0, NULL, SQLP_I ); }
201
| NAME EQUAL FLOATNUM { sqpAssignment( $1, NULL, 0, $3, NULL, SQLP_D ); }
202
*/ | NAME EQUAL y_expression { sqpAssignment( $1, NULL, 0, 0.0, $3, SQLP_EXPR ); }
208
sqlpStmt->upperNodeptr = $$;
213
y_sub_condition2 { $$ = $1; }
214
| y_sub_condition OR y_sub_condition2 { $$ = sqpNewExpressionNode (SQLP_OR, $1, $3); }
218
y_boolean { $$ = $1; }
219
| y_sub_condition2 AND y_boolean { $$ = sqpNewExpressionNode (SQLP_AND, $1, $3); }
223
y_comparison { $$ = $1; }
224
| '(' y_sub_condition ')' { $$ = $2; }
225
| NOT y_boolean { $$ = sqpNewExpressionNode ( SQLP_NOT, NULL, $2); }
228
/* Note EQUAL should be one of COMPARISON but there is maybe some reason ... */
230
y_expression EQUAL y_expression {
231
$$ = sqpNewExpressionNode ( SQLP_EQ, $1, $3);
233
| y_expression COMPARISON_OPERATOR y_expression {
234
$$ = sqpNewExpressionNode ( sqpOperatorCode($2), $1, $3);
236
| y_expression IS NULL_VALUE {
237
$$ = sqpNewExpressionNode ( SQLP_ISNULL, NULL, $1);
239
| y_expression NOT NULL_VALUE {
240
$$ = sqpNewExpressionNode ( SQLP_NOTNULL, NULL, $1);
244
/* Mathematical expression */
246
y_product { $$ = $1; }
247
| y_expression '+' y_product {
248
$$ = sqpNewExpressionNode ( sqpOperatorCode("+"), $1, $3 );
250
| y_expression '-' y_product {
251
$$ = sqpNewExpressionNode ( sqpOperatorCode("-"), $1, $3 );
257
| y_product '*' y_term {
258
$$ = sqpNewExpressionNode ( sqpOperatorCode("*"), $1, $3 );
260
| y_product '/' y_term {
261
$$ = sqpNewExpressionNode ( sqpOperatorCode("/"), $1, $3 );
268
$$ = sqpNewExpressionNode ( sqpOperatorCode("-"), sqpNewValueNode ( NULL, 0, 0.0, SQLP_I ), $2 );
274
| y_column { $$ = $1; }
275
| '(' y_expression ')' { $$ = $2; }
278
/* Value used in expressions */
280
STRING { $$ = sqpNewValueNode ( $1, 0, 0.0, SQLP_S ); }
281
| INTNUM { $$ = sqpNewValueNode ( NULL, $1, 0.0, SQLP_I ); }
282
| FLOATNUM { $$ = sqpNewValueNode ( NULL, 0, $1, SQLP_D ); }
285
/* Column used in expressions */
287
NAME {$$ = sqpNewColumnNode ( $1 );}
290
y_order: y_order_asc | y_order_desc;
293
NAME { sqpOrderColumn( $1, SORT_ASC ); }
294
| NAME ASC { sqpOrderColumn( $1, SORT_ASC ); }
297
NAME DESC { sqpOrderColumn( $1, SORT_DESC ); }