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

Reply via email to