Changeset: 784c0085f163 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=784c0085f163
Modified Files:
sql/server/rel_semantic.c
sql/server/sql_parser.h
sql/server/sql_parser.y
Branch: sciql
Log Message:
various changes in the parser for SciQL:
- added rules to handle 'CREATE VIEW ARRAY'
- add real implementation for the rules dim_range_list, dim_range, dim_exp, and
index_exp_list, index_exp, index_term
- differentiate reference to array dimensions (array_dim_ref) and array cells
(array_cell_ref) since there are places where only one of these rules are
allowed
- removed rules from value_exp that seem incorrect to me
- since we support 'GROUP BY DISTINCT' for structure-grouping, let's also
support this for normal SQL queries, as it's a SQL:2003 feature. This has
been added in the parser,
(TODO:) but executing a GROUP BY query now triggers an assertion.
- TODO: two testing queries (sciql05.sql and sciql21.sql) still produces parser
errors.
diffs (truncated from 311 to 300 lines):
diff --git a/sql/server/rel_semantic.c b/sql/server/rel_semantic.c
--- a/sql/server/rel_semantic.c
+++ b/sql/server/rel_semantic.c
@@ -302,7 +302,7 @@
return rel_selects(sql, s);
case SQL_ARRAY:
- case SQL_INDEX:
+ case SQL_ARRAY_INDEX:
case SQL_DIMENSION:
return sql_error(sql, 02, "Array not type checked yet");
default:
diff --git a/sql/server/sql_parser.h b/sql/server/sql_parser.h
--- a/sql/server/sql_parser.h
+++ b/sql/server/sql_parser.h
@@ -179,9 +179,8 @@
SQL_CREATE_ARRAY,
SQL_DROP_ARRAY,
SQL_ARRAY,
- SQL_INDEX,
- SQL_DIMENSION,
- SQL_DIMENSION_SPEC
+ SQL_ARRAY_INDEX,
+ SQL_DIMENSION
} tokens;
typedef enum jt {
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -261,9 +261,10 @@
XML_primary
opt_comma_string_value_expression
- group_item
+ group_item /* sciql structural grouping */
dimension
- array_element
+ array_dim_ref
+ array_cell_ref
%type <type>
data_type
@@ -384,11 +385,11 @@
dim_range
dim_range_list
dim_exp
- index_exp
+ index_exp /* position indices of array cells */
index_exp_list
index_term
- array_element_list
+ array_element_def_list
%type <i_val>
any_all_some
@@ -750,11 +751,6 @@
append_string(l, sa_strdup(SA, "current_timezone"));
append_symbol(l, $4 );
$$ = _symbol_create_list( SQL_SET, l); }
- | set array_element '=' simple_atom
- { dlist *l = L();
- append_symbol(l, $2 );
- append_symbol(l, $4 );
- $$ = _symbol_create_list( SQL_SET, l); }
;
schema:
@@ -1597,37 +1593,41 @@
'[' dim_exp ':' dim_exp ':' dim_exp ']'
{
dlist *l = L();
- $$= l;
+ append_list(l, $2);
+ append_list(l, $4);
+ $$ = append_list(l, $6);
}
| '[' dim_exp ':' dim_exp ']'
{
dlist *l = L();
- $$= l;
+ append_list(l, $2);
+ $$ = append_list(l, $4);
}
| '[' dim_exp ']' /* size of INT dim or '*' */
{
- dlist *l = L();
- $$= l;
+ $$= append_list(L(), $2);
}
| '[' ident ']' /* sequence name */
{
- dlist *l = L();
- $$= l;
+ $$= append_string(L(), $2);
}
;
dim_exp :
literal
{
- $$= L();
+ $$= append_symbol(L(), $1);
}
| '-' literal
{
- $$= L();
+ dlist *l = L();
+ append_list(l,
+ append_string(l, sa_strdup(SA, "sql_neg")));
+ $$= append_symbol(l, $2);
}
| '*'
{
- $$= NULL;
+ $$= append_symbol(L(), NULL);
}
serial_opt_params:
@@ -1760,6 +1760,15 @@
append_int(l, TRUE); /* persistent view */
$$ = _symbol_create_list( SQL_CREATE_VIEW, l );
}
+ | create VIEW ARRAY qname '(' array_element_def_list ')' AS query_expression
opt_with_check_option
+ { dlist *l = L();
+ append_list(l, $4);
+ append_list(l, $6);
+ append_symbol(l, $9);
+ append_int(l, $10);
+ append_int(l, TRUE); /* persistent view */
+ $$ = _symbol_create_list( SQL_CREATE_VIEW, l );
+ }
;
query_expression:
@@ -2697,6 +2706,13 @@
append_string(l, $1);
$$ = _symbol_create_list( SQL_ASSIGN, l); }
+ | array_cell_ref '=' search_condition
+
+ { dlist *l = L();
+ append_symbol(l, $3 );
+ append_string(l, $1);
+ $$ = _symbol_create_list( SQL_ASSIGN, l); }
+
| column '=' sqlNULL
{ dlist *l = L();
@@ -3003,9 +3019,12 @@
{ $$ = $2;
append_symbol($2->data.lval, $4); }
*/
- | ident index_exp_list {
+ | array_dim_ref { /* allow "s1.a1[x][1:2]" */
+ $$ = _symbol_create_symbol( SQL_ARRAY, $1);
+ }
+ | array_dim_ref table_name { /* allow "s1.a1[x][1:2] AS <ident>" */
dlist *l = L();
- l = append_string(l, $1);
+ l = append_symbol(l, $1);
l = append_list(l, $2);
$$ = _symbol_create_list( SQL_ARRAY, l);
}
@@ -3052,7 +3071,6 @@
opt_group_by_clause:
/* empty */ { $$ = NULL; }
- | sqlGROUP BY column_ref_commalist { $$ = _symbol_create_list( SQL_GROUPBY,
$3 );}
| sqlGROUP BY group_ref_commalist {
dlist *l = L();
l= append_list(l,$3);
@@ -3072,13 +3090,9 @@
;
group_item:
- ident index_exp_list {
- dlist *l = L();
- l = append_string(l, $1);
- l = append_list(l, $2);
- $$ = _symbol_create_list( SQL_INDEX, l);
- }
- | scalar_exp { $$= $1; }
+ column_ref { $$ = _symbol_create_list(SQL_COLUMN, $1); }
+ | array_dim_ref { $$ = _symbol_create_symbol( SQL_ARRAY_INDEX, $1); }
+ | array_cell_ref { $$ = _symbol_create_symbol(SQL_COLUMN, $1); }
;
column_ref_commalist:
@@ -3435,34 +3449,32 @@
| cast_exp
| XML_value_function
| param
- | array_element
+ | array_dim_ref
+ | array_cell_ref
| ARRAY '(' scalar_exp_list ')' {
dlist *l = L();
l = append_list(l,$3);
$$ = _symbol_create_list( SQL_ARRAY, l);
}
-/*
- | '(' scalar_exp_list ')' {
- dlist *l = L();
- l = append_list(l,$2);
- $$ = _symbol_create_list( SQL_ARRAY, l);
- }
-*/
- | '[' scalar_exp ']'
- {
- $$ = NULL;
- }
;
-array_element:
- ident index_exp_list '.' ident {
- dlist *l = L();
- l = append_string(l, $1);
- l = append_string(l, $4);
- l = append_list(l, $2);
- $$ = _symbol_create_list( SQL_INDEX, l);
- }
- ;
+array_dim_ref:
+ qname index_exp_list {
+ dlist *l = L();
+ l = append_string(l, $1);
+ l = append_list(l, $2);
+ $$ = _symbol_create_list( SQL_ARRAY_INDEX, l);
+ }
+;
+
+array_cell_ref:
+ array_dim_ref '.' ident {
+ dlist *l = L();
+ l = append_symbol(l, $1);
+ l = append_list(l, $3);
+ $$ = _symbol_create_list( SQL_ARRAY_INDEX, l);
+ }
+;
param:
'?'
@@ -3692,6 +3704,8 @@
append_symbol(l, $1);
append_string(l, $2);
$$ = _symbol_create_list( SQL_COLUMN, l ); }
+ | '[' scalar_exp ']'
+ { $$ = _symbol_create_symbol( SQL_COLUMN, $2 ); }
;
opt_alias_name:
@@ -4225,28 +4239,30 @@
'[' index_term ':' index_term ':' index_term ']'
{
dlist *l = L();
- $$= l;
+ append_list(l, $2);
+ append_list(l, $4);
+ $$ = append_list(l, $6);
}
| '[' index_term ':' index_term ']'
{
dlist *l = L();
- $$= l;
+ append_list(l, $2);
+ $$ = append_list(l, $4);
}
| '[' index_term ']'
{
- dlist *l = L();
- $$= l;
+ $$= append_string(L(), $2);
}
;
index_term :
scalar_exp
{
- $$= L();
+ $$= append_symbol(L(), $1);
}
| '*'
- {
- $$= NULL;
+ {
+ $$= append_symbol(L(), NULL);
}
cast_exp:
@@ -4566,16 +4582,16 @@
sql_init_subtype(&$$, t, $3, 0);
}
}
- | ARRAY '(' array_element_list ')' {
+ | ARRAY '(' array_element_def_list ')' {
/* use a fake type for now */
sql_find_subtype(&$$, "int", 0, 0);
}
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list