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