Changeset: a3b38049ebec for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a3b38049ebec
Added Files:
        sql/test/BugTracker-2015/Tests/null.Bug-3833.sql
        sql/test/BugTracker-2015/Tests/null.Bug-3833.stable.err
        sql/test/BugTracker-2015/Tests/null.Bug-3833.stable.out
Modified Files:
        sql/server/rel_schema.c
        sql/server/sql_parser.y
        sql/server/sql_scan.c
        sql/test/BugTracker-2015/Tests/All
Branch: Jul2015
Log Message:

fixes for bug 3833, we now allow NULL almost everywhere in the
queries (beware NULL != NULL semantics are always inplace)
For equality use IS NULL.


diffs (truncated from 474 to 300 lines):

diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -384,8 +384,26 @@ column_option(
                res = column_constraint_type(sql, opt_name, sym, ss, t, cs);
        }       break;
        case SQL_DEFAULT: {
-               char *err = NULL, *r = symbol2string(sql, s->data.sym, &err);
+               symbol *sym = s->data.sym;
+               char *err = NULL, *r;
 
+               if (sym->token == SQL_COLUMN) {
+                       sql_exp *e = rel_logical_value_exp(sql, NULL, sym, 
sql_sel);
+                       
+                       if (e && is_atom(e->type)) {
+                               atom *a = exp_value(e, sql->args, sql->argc);
+
+                               if (atom_null(a)) {
+                                       mvc_default(sql, cs, NULL);
+                                       res = SQL_OK;
+                                       break;
+                               }
+                       }
+                       /* reset error */
+                       sql->session->status = 0;
+                       sql->errstr[0] = '\0';
+               }
+               r = symbol2string(sql, s->data.sym, &err);
                if (!r) {
                        (void) sql_error(sql, 02, "42000!incorrect default 
value '%s'\n", err?err:"");
                        if (err) _DELETE(err);
@@ -399,6 +417,7 @@ column_option(
        case SQL_ATOM: {
                AtomNode *an = (AtomNode *) s;
 
+               assert(0);
                if (!an || !an->a) {
                        mvc_default(sql, cs, NULL);
                } else {
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
@@ -135,7 +135,6 @@ int yydebug=1;
        join_spec
        search_condition
        and_exp
-       not_exp
        update_statement
        update_stmt
        control_statement
@@ -484,7 +483,7 @@ int yydebug=1;
 
 %token USER CURRENT_USER SESSION_USER LOCAL LOCKED BEST EFFORT
 %token  CURRENT_ROLE sqlSESSION
-%token <sval> sqlDELETE UPDATE SELECT INSERT DATABASE 
+%token <sval> sqlDELETE UPDATE SELECT INSERT 
 %token <sval> LEFT RIGHT FULL OUTER NATURAL CROSS JOIN INNER
 %token <sval> COMMIT ROLLBACK SAVEPOINT RELEASE WORK CHAIN NO PRESERVE ROWS
 %token  START TRANSACTION READ WRITE ONLY ISOLATION LEVEL
@@ -522,10 +521,10 @@ int yydebug=1;
 %left <operation> '(' ')'
 %left <sval> FILTER_FUNC 
 
+%left <operation> NOT
 %left <operation> '='
-%left <operation> ALL ANY BETWEEN sqlIN LIKE ILIKE OR SOME
+%left <operation> ALL ANY NOT_BETWEEN BETWEEN NOT_IN sqlIN NOT_LIKE LIKE 
NOT_ILIKE ILIKE OR SOME
 %left <operation> AND
-%left <operation> NOT
 %left <sval> COMPARISON /* <> < > <= >= */
 %left <operation> '+' '-' '&' '|' '^' LEFT_SHIFT RIGHT_SHIFT LEFT_SHIFT_ASSIGN 
RIGHT_SHIFT_ASSIGN CONCATSTRING SUBSTRING POSITION SPLIT_PART
 %right UMINUS
@@ -1554,7 +1553,6 @@ default:
 
 default_value:
     simple_scalar_exp  { $$ = $1; }
- |  sqlNULL    { $$ = _newAtomNode( NULL);  }
  ;
 
 column_constraint:
@@ -2049,7 +2047,6 @@ return_value:
    |  search_condition
    |  TABLE '(' query_expression ')'   
                { $$ = _symbol_create_symbol(SQL_TABLE, $3); }
-   |  sqlNULL  { $$ = _newAtomNode( NULL);  }
    ;
 
 case_statement:
@@ -2777,7 +2774,6 @@ null:
 
 simple_atom:
     scalar_exp
- |  null
  ;
 
 insert_atom:
@@ -2807,11 +2803,6 @@ assignment:
          append_symbol(l, $3 );
          append_string(l, $1);
          $$ = _symbol_create_list( SQL_ASSIGN, l); }
- | column '=' sqlNULL
-       { dlist *l = L();
-         append_symbol(l, NULL );
-         append_string(l, $1);
-         $$ = _symbol_create_list( SQL_ASSIGN, l); }
  |  column_commalist_parens '=' subquery
        { dlist *l = L();
          append_symbol(l, $3);
@@ -3195,22 +3186,11 @@ search_condition:
  ;
    
 and_exp:
-    not_exp AND and_exp
+    pred_exp AND and_exp
                { dlist *l = L();
                  append_symbol(l, $1);
                  append_symbol(l, $3);
                  $$ = _symbol_create_list(SQL_AND, l ); }
- |  not_exp    { $$ = $1; }
- ;
-
-not_exp:
-    NOT not_exp 
-               { $$ = $2;
-
-                 if ($$->token == SQL_EXISTS)
-                       $$->token = SQL_NOT_EXISTS;
-                 else
-                       $$ = _symbol_create_symbol(SQL_NOT, $2); }
  |  pred_exp   { $$ = $1; }
  ;
 
@@ -3285,18 +3265,37 @@ predicate:
  ;
 
 pred_exp:
-    predicate
+    NOT pred_exp 
+               { $$ = $2;
+
+                 if ($$->token == SQL_EXISTS)
+                       $$->token = SQL_NOT_EXISTS;
+                 else if ($$->token == SQL_NOT_EXISTS)
+                       $$->token = SQL_EXISTS;
+                 else if ($$->token == SQL_NOT_BETWEEN)
+                       $$->token = SQL_BETWEEN;
+                 else if ($$->token == SQL_BETWEEN)
+                       $$->token = SQL_NOT_BETWEEN;
+                 else if ($$->token == SQL_NOT_LIKE)
+                       $$->token = SQL_LIKE;
+                 else if ($$->token == SQL_LIKE)
+                       $$->token = SQL_NOT_LIKE;
+                 else
+                       $$ = _symbol_create_symbol(SQL_NOT, $2); }
+ |   predicate { $$ = $1; }
  ;
 
 comparison_predicate:
     pred_exp COMPARISON pred_exp
                { dlist *l = L();
+
                  append_symbol(l, $1);
                  append_string(l, $2);
                  append_symbol(l, $3);
                  $$ = _symbol_create_list(SQL_COMPARE, l ); }
  |  pred_exp '=' pred_exp
                { dlist *l = L();
+
                  append_symbol(l, $1);
                  append_string(l, sa_strdup(SA, "="));
                  append_symbol(l, $3);
@@ -3304,12 +3303,12 @@ comparison_predicate:
  ;
 
 between_predicate:
-    pred_exp NOT BETWEEN opt_bounds pred_exp AND pred_exp
+    pred_exp NOT_BETWEEN opt_bounds pred_exp AND pred_exp
                { dlist *l = L();
                  append_symbol(l, $1);
-                 append_int(l, $4);
-                 append_symbol(l, $5);
-                 append_symbol(l, $7);
+                 append_int(l, $3);
+                 append_symbol(l, $4);
+                 append_symbol(l, $6);
                  $$ = _symbol_create_list(SQL_NOT_BETWEEN, l ); }
  |  pred_exp BETWEEN opt_bounds pred_exp AND pred_exp
                { dlist *l = L();
@@ -3327,17 +3326,17 @@ opt_bounds:
  ;
 
 like_predicate:
-    pred_exp NOT LIKE like_exp
+    pred_exp NOT_LIKE like_exp
                { dlist *l = L();
                  append_symbol(l, $1);
-                 append_symbol(l, $4);
+                 append_symbol(l, $3);
                  append_int(l, FALSE);  /* case sensitive */
                  append_int(l, TRUE);  /* anti */
                  $$ = _symbol_create_list( SQL_LIKE, l ); }
- |  pred_exp NOT ILIKE like_exp
+ |  pred_exp NOT_ILIKE like_exp
                { dlist *l = L();
                  append_symbol(l, $1);
-                 append_symbol(l, $4);
+                 append_symbol(l, $3);
                  append_int(l, TRUE);  /* case insensitive */
                  append_int(l, TRUE);  /* anti */
                  $$ = _symbol_create_list( SQL_LIKE, l ); }
@@ -3385,20 +3384,22 @@ test_for_null:
  ;
 
 in_predicate:
-    pred_exp NOT sqlIN '(' value_commalist ')'
+    pred_exp NOT_IN '(' value_commalist ')'
                { dlist *l = L();
+
                  append_symbol(l, $1);
-                 append_list(l, $5);
+                 append_list(l, $4);
                  $$ = _symbol_create_list(SQL_NOT_IN, l ); }
  |  pred_exp sqlIN '(' value_commalist ')'
                { dlist *l = L();
+
                  append_symbol(l, $1);
                  append_list(l, $4);
                  $$ = _symbol_create_list(SQL_IN, l ); }
- |  '(' pred_exp_list ')' NOT sqlIN '(' value_commalist ')'
+ |  '(' pred_exp_list ')' NOT_IN '(' value_commalist ')'
                { dlist *l = L();
                  append_list(l, $2);
-                 append_list(l, $7);
+                 append_list(l, $6);
                  $$ = _symbol_create_list(SQL_NOT_IN, l ); }
  |  '(' pred_exp_list ')' sqlIN '(' value_commalist ')'
                { dlist *l = L();
@@ -3433,7 +3434,6 @@ any_all_some:
 
 existence_test:
     EXISTS subquery    { $$ = _symbol_create_symbol( SQL_EXISTS, $2 ); }
-/*|  NOT EXISTS subquery { $$ = _symbol_create_symbol( SQL_NOT_EXISTS, $3 ); 
}*/
  ;
 
 filter_arg_list:
@@ -3600,6 +3600,7 @@ value_exp:
  |  cast_exp
  |  XML_value_function
  |  param
+ |  null
  ;
 
 param:  
@@ -3921,11 +3922,6 @@ column_exp:
                  append_symbol(l, $1);
                  append_string(l, NULL);
                  $$ = _symbol_create_list( SQL_TABLE, l ); }
- |  null opt_alias_name
-               { dlist *l = L();
-                 append_symbol(l, $1 );
-                 append_string(l, $2);
-                 $$ = _symbol_create_list( SQL_COLUMN, l ); }
  |  search_condition opt_alias_name
                { dlist *l = L();
                  append_symbol(l, $1);
@@ -4471,18 +4467,10 @@ literal:
                { sql_subtype t;
                  sql_find_subtype(&t, "boolean", 0, 0 );
                  $$ = _newAtomNode( atom_bool(SA, &t, FALSE)); }
- |  NOT BOOL_FALSE
-               { sql_subtype t;
-                 sql_find_subtype(&t, "boolean", 0, 0 );
-                 $$ = _newAtomNode( atom_bool(SA, &t, TRUE)); }
  |  BOOL_TRUE
                { sql_subtype t;
                  sql_find_subtype(&t, "boolean", 0, 0 );
                  $$ = _newAtomNode( atom_bool(SA, &t, TRUE)); }
- |  NOT BOOL_TRUE
-               { sql_subtype t;
-                 sql_find_subtype(&t, "boolean", 0, 0 );
-                 $$ = _newAtomNode( atom_bool(SA, &t, FALSE)); }
  ;
 
 interval_expression:
@@ -4577,7 +4565,6 @@ cast_exp:
 
 cast_value:
        search_condition
- |     null     
  ;
 
 case_exp:
@@ -4651,12 +4638,10 @@ when_search_list:
 case_opt_else:
     /* empty */                { $$ = NULL; }
  |  ELSE scalar_exp    { $$ = $2; }
- |  ELSE sqlNULL       { $$ = _newAtomNode(NULL); }
  ;
 
 case_scalar_exp:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to