Changeset: bee93cbacfa0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bee93cbacfa0
Modified Files:
sql/backends/monet5/rel_bin.c
sql/server/rel_psm.c
sql/server/rel_select.c
sql/server/sql_parser.h
sql/server/sql_parser.y
sql/test/Dependencies/Tests/Dependencies.stable.out
sql/test/Dependencies/Tests/Dependencies.stable.out.int128
Branch: Mar2018
Log Message:
partial fixes for bug 6605, ie handle again NULLs on the left side.
diffs (truncated from 303 to 300 lines):
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1956,11 +1956,12 @@ rel2bin_semijoin(backend *be, sql_rel *r
* second selects/filters
*/
if (rel->exps && rel->op == op_anti && need_no_nil(rel)) {
- list *l;
- stmt *sel = NULL;
+ sql_subtype *lng = sql_bind_localtype("lng");
+ stmt *nilcnt = NULL;
for( en = rel->exps->h; en; en = en->next ) {
sql_exp *e = en->data, *r, *l;
+ stmt *s;
if (e->type != e_cmp || e->flag != cmp_equal)
break;
@@ -1968,28 +1969,33 @@ rel2bin_semijoin(backend *be, sql_rel *r
r = e->r;
/* for each equality join add a rel_select(r is NULL) */
- stmt *s = exp_bin(be, r, right, NULL, NULL, NULL, NULL,
NULL);
+ s = exp_bin(be, r, right, NULL, NULL, NULL, NULL, NULL);
if (!s)
s = exp_bin(be, l, right, NULL, NULL, NULL,
NULL, NULL);
if (s && !exp_is_atom(r)) {
- sql_subtype *lng = sql_bind_localtype("lng");
sql_subaggr *cnt = sql_bind_aggr(sql->sa,
sql->session->schema, "count", NULL);
- sql_subtype *bt = sql_bind_localtype("bit");
- sql_subfunc *ne = sql_bind_func_result(sql->sa,
sql->session->schema, "<>", lng, lng, bt);
-
- stmt *l;
+ sql_subfunc *add =
sql_bind_func_result(sql->sa, sql->session->schema, "sql_add", lng, lng, lng);
+
s = stmt_selectnil(be, s);
- s = stmt_binop(be, stmt_aggr(be, s, NULL, NULL,
cnt, 1, 0, 1), stmt_atom_lng(be, 0), ne);
-
- l = bin_first_column(be, left);
- /* keep if no nulls are in the right side */
- l = stmt_const(be, l, stmt_bool(be,0));
- sel = stmt_uselect(be, l, s, cmp_equal, sel, 0);
+ s = stmt_aggr(be, s, NULL, NULL, cnt, 1, 0, 1);
+ if (nilcnt) {
+ nilcnt = stmt_binop(be, nilcnt, s, add);
+ } else {
+ nilcnt = s;
+ }
}
-
}
- l = sa_list(sql->sa);
- if (left && sel) {
+ if (nilcnt) {
+ sql_subtype *bt = sql_bind_localtype("bit");
+ sql_subfunc *ne = sql_bind_func_result(sql->sa,
sql->session->schema, "<>", lng, lng, bt);
+ stmt *ls = bin_first_column(be, left), *s, *sel;
+ list *l;
+
+ s = stmt_binop(be, nilcnt, stmt_atom_lng(be, 0), ne);
+ /* keep if no nulls are in the right side */
+ ls = stmt_const(be, ls, stmt_bool(be,0));
+ sel = stmt_uselect(be, ls, s, cmp_equal, NULL, 0);
+ l = sa_list(sql->sa);
for( n = left->op4.lval->h; n; n = n->next ) {
stmt *col = n->data;
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -627,6 +627,7 @@ sequential_block (mvc *sql, sql_subtype
case SQL_DECLARE:
reslist = rel_psm_declare(sql, s->data.lval->h);
break;
+ case SQL_DECLARE_TABLE:
case SQL_CREATE_TABLE:
res = rel_psm_declare_table(sql, s->data.lval->h);
break;
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -2539,6 +2539,26 @@ rel_logical_exp(mvc *sql, sql_rel *rel,
ek.card = card_set;
select = rel_select(sql->sa, rel_dup(rel), NULL); /*
dup to make sure we get a new select op */
rel_destroy(rel);
+ /* first remove the NULLs */
+ if (!l_is_value && sc->token == SQL_NOT_IN &&
+ l->card != CARD_ATOM && has_nil(l)) {
+ sql_exp *ol;
+
+ if (l->type != e_column) {
+ pexps = rel_projections(sql, rel, NULL,
1, 1);
+ rel = rel_project(sql->sa, rel,
rel_projections(sql, rel, NULL, 1, 1));
+ select->l = rel;
+ l = exp_label(sql->sa, l, ++sql->label);
+ append(rel->exps, l);
+ ol = l;
+ l = exp_column(sql->sa,
exp_relname(ol), exp_name(ol), exp_subtype(ol), ol->card, has_nil(ol),
is_intern(ol));
+ }
+ e = rel_unop_(sql, l, NULL, "isnull",
card_value);
+ e = exp_compare(sql->sa, e,
exp_atom_bool(sql->sa, 0), cmp_equal);
+ rel_select_add_exp(sql->sa, select, e);
+ if (pexps)
+ l = exp_column(sql->sa,
exp_relname(ol), exp_name(ol), exp_subtype(ol), ol->card, has_nil(ol),
is_intern(ol));
+ }
rel = left = select;
append(ll, l);
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
@@ -49,6 +49,7 @@ typedef enum tokens {
SQL_DROP_DEFAULT,
SQL_ANALYZE,
SQL_DECLARE,
+ SQL_DECLARE_TABLE,
SQL_COMMENT,
SQL_SET,
SQL_CALL,
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
@@ -768,7 +768,7 @@ opt_minmax:
declare_statement:
declare variable_list
{ $$ = _symbol_create_list( SQL_DECLARE, $2); }
- | declare table_def { $$ = $2; }
+ | declare table_def { $$ = $2; if ($$) $$->token = SQL_DECLARE_TABLE; }
;
variable_list:
@@ -6176,6 +6176,7 @@ char *token2string(int token)
SQL(DROP_CONSTRAINT);
SQL(DROP_DEFAULT);
SQL(DECLARE);
+ SQL(DECLARE_TABLE);
SQL(COMMENT);
SQL(SET);
SQL(PREP);
diff --git a/sql/test/Dependencies/Tests/Dependencies.stable.out
b/sql/test/Dependencies/Tests/Dependencies.stable.out
--- a/sql/test/Dependencies/Tests/Dependencies.stable.out
+++ b/sql/test/Dependencies/Tests/Dependencies.stable.out
@@ -632,9 +632,9 @@ Cleanup
[ "functions", "dependency_functions_on_views", "DEP_VIEW" ]
[ "users", "dependency_schemas_on_users", "DEP_VIEW" ]
[ "schemas", "dependency_schemas_on_users", "DEP_VIEW" ]
-[ "functions", "dependency_tables_on_functions", "DEP_VIEW" ]
+[ "tables", "dependency_tables_on_functions", "DEP_VIEW" ]
[ "dependencies", "dependency_tables_on_functions", "DEP_VIEW"
]
-[ "tables", "dependency_tables_on_functions", "DEP_VIEW" ]
+[ "functions", "dependency_tables_on_functions", "DEP_VIEW" ]
[ "functions", "dependency_views_on_functions", "DEP_VIEW" ]
[ "dependencies", "dependency_views_on_functions", "DEP_VIEW"
]
[ "tables", "dependency_views_on_functions", "DEP_VIEW" ]
@@ -657,16 +657,16 @@ Cleanup
[ "tables", "dependency_tables_on_indexes", "DEP_VIEW" ]
[ "keys", "dependency_tables_on_indexes", "DEP_VIEW" ]
[ "columns", "dependency_columns_on_indexes", "DEP_VIEW" ]
-[ "tables", "dependency_columns_on_indexes", "DEP_VIEW" ]
+[ "idxs", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "objects", "dependency_columns_on_indexes", "DEP_VIEW" ]
-[ "idxs", "dependency_columns_on_indexes", "DEP_VIEW" ]
+[ "tables", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "keys", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "keys", "dependency_tables_on_foreignkeys", "DEP_VIEW" ]
[ "tables", "dependency_tables_on_foreignkeys", "DEP_VIEW" ]
[ "keys", "dependency_keys_on_foreignkeys", "DEP_VIEW" ]
-[ "functions", "dependency_tables_on_procedures", "DEP_VIEW" ]
+[ "tables", "dependency_tables_on_procedures", "DEP_VIEW" ]
[ "dependencies", "dependency_tables_on_procedures", "DEP_VIEW"
]
-[ "tables", "dependency_tables_on_procedures", "DEP_VIEW" ]
+[ "functions", "dependency_tables_on_procedures", "DEP_VIEW" ]
[ "functions", "dependency_views_on_procedures", "DEP_VIEW" ]
[ "dependencies", "dependency_views_on_procedures", "DEP_VIEW"
]
[ "tables", "dependency_views_on_procedures", "DEP_VIEW" ]
@@ -838,11 +838,11 @@ Cleanup
[ "id", "dependency_schemas_on_users", "DEP_VIEW" ]
[ "name", "dependency_schemas_on_users", "DEP_VIEW" ]
[ "id", "dependency_tables_on_functions", "DEP_VIEW" ]
+[ "depend_id", "dependency_tables_on_functions", "DEP_VIEW" ]
+[ "depend_type", "dependency_tables_on_functions", "DEP_VIEW"
]
+[ "id", "dependency_tables_on_functions", "DEP_VIEW" ]
[ "name", "dependency_tables_on_functions", "DEP_VIEW" ]
[ "type", "dependency_tables_on_functions", "DEP_VIEW" ]
-[ "id", "dependency_tables_on_functions", "DEP_VIEW" ]
-[ "depend_id", "dependency_tables_on_functions", "DEP_VIEW" ]
-[ "depend_type", "dependency_tables_on_functions", "DEP_VIEW"
]
[ "id", "dependency_views_on_functions", "DEP_VIEW" ]
[ "name", "dependency_views_on_functions", "DEP_VIEW" ]
[ "type", "dependency_views_on_functions", "DEP_VIEW" ]
@@ -890,12 +890,12 @@ Cleanup
[ "table_id", "dependency_tables_on_indexes", "DEP_VIEW" ]
[ "name", "dependency_tables_on_indexes", "DEP_VIEW" ]
[ "id", "dependency_columns_on_indexes", "DEP_VIEW" ]
-[ "name", "dependency_columns_on_indexes", "DEP_VIEW" ]
-[ "nr", "dependency_columns_on_indexes", "DEP_VIEW" ]
-[ "id", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "table_id", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "type", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "name", "dependency_columns_on_indexes", "DEP_VIEW" ]
+[ "id", "dependency_columns_on_indexes", "DEP_VIEW" ]
+[ "name", "dependency_columns_on_indexes", "DEP_VIEW" ]
+[ "nr", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "table_id", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "name", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "id", "dependency_tables_on_foreignkeys", "DEP_VIEW" ]
@@ -909,11 +909,11 @@ Cleanup
[ "name", "dependency_keys_on_foreignkeys", "DEP_VIEW" ]
[ "rkey", "dependency_keys_on_foreignkeys", "DEP_VIEW" ]
[ "id", "dependency_tables_on_procedures", "DEP_VIEW" ]
+[ "depend_id", "dependency_tables_on_procedures", "DEP_VIEW" ]
+[ "depend_type", "dependency_tables_on_procedures", "DEP_VIEW"
]
+[ "id", "dependency_tables_on_procedures", "DEP_VIEW" ]
[ "name", "dependency_tables_on_procedures", "DEP_VIEW" ]
[ "type", "dependency_tables_on_procedures", "DEP_VIEW" ]
-[ "id", "dependency_tables_on_procedures", "DEP_VIEW" ]
-[ "depend_id", "dependency_tables_on_procedures", "DEP_VIEW" ]
-[ "depend_type", "dependency_tables_on_procedures", "DEP_VIEW"
]
[ "id", "dependency_views_on_procedures", "DEP_VIEW" ]
[ "name", "dependency_views_on_procedures", "DEP_VIEW" ]
[ "type", "dependency_views_on_procedures", "DEP_VIEW" ]
diff --git a/sql/test/Dependencies/Tests/Dependencies.stable.out.int128
b/sql/test/Dependencies/Tests/Dependencies.stable.out.int128
--- a/sql/test/Dependencies/Tests/Dependencies.stable.out.int128
+++ b/sql/test/Dependencies/Tests/Dependencies.stable.out.int128
@@ -632,9 +632,9 @@ Cleanup
[ "functions", "dependency_functions_on_views", "DEP_VIEW" ]
[ "users", "dependency_schemas_on_users", "DEP_VIEW" ]
[ "schemas", "dependency_schemas_on_users", "DEP_VIEW" ]
-[ "functions", "dependency_tables_on_functions", "DEP_VIEW" ]
+[ "tables", "dependency_tables_on_functions", "DEP_VIEW" ]
[ "dependencies", "dependency_tables_on_functions", "DEP_VIEW"
]
-[ "tables", "dependency_tables_on_functions", "DEP_VIEW" ]
+[ "functions", "dependency_tables_on_functions", "DEP_VIEW" ]
[ "functions", "dependency_views_on_functions", "DEP_VIEW" ]
[ "dependencies", "dependency_views_on_functions", "DEP_VIEW"
]
[ "tables", "dependency_views_on_functions", "DEP_VIEW" ]
@@ -657,16 +657,16 @@ Cleanup
[ "tables", "dependency_tables_on_indexes", "DEP_VIEW" ]
[ "keys", "dependency_tables_on_indexes", "DEP_VIEW" ]
[ "columns", "dependency_columns_on_indexes", "DEP_VIEW" ]
-[ "tables", "dependency_columns_on_indexes", "DEP_VIEW" ]
+[ "idxs", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "objects", "dependency_columns_on_indexes", "DEP_VIEW" ]
-[ "idxs", "dependency_columns_on_indexes", "DEP_VIEW" ]
+[ "tables", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "keys", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "keys", "dependency_tables_on_foreignkeys", "DEP_VIEW" ]
[ "tables", "dependency_tables_on_foreignkeys", "DEP_VIEW" ]
[ "keys", "dependency_keys_on_foreignkeys", "DEP_VIEW" ]
-[ "functions", "dependency_tables_on_procedures", "DEP_VIEW" ]
+[ "tables", "dependency_tables_on_procedures", "DEP_VIEW" ]
[ "dependencies", "dependency_tables_on_procedures", "DEP_VIEW"
]
-[ "tables", "dependency_tables_on_procedures", "DEP_VIEW" ]
+[ "functions", "dependency_tables_on_procedures", "DEP_VIEW" ]
[ "functions", "dependency_views_on_procedures", "DEP_VIEW" ]
[ "dependencies", "dependency_views_on_procedures", "DEP_VIEW"
]
[ "tables", "dependency_views_on_procedures", "DEP_VIEW" ]
@@ -838,11 +838,11 @@ Cleanup
[ "id", "dependency_schemas_on_users", "DEP_VIEW" ]
[ "name", "dependency_schemas_on_users", "DEP_VIEW" ]
[ "id", "dependency_tables_on_functions", "DEP_VIEW" ]
+[ "depend_id", "dependency_tables_on_functions", "DEP_VIEW" ]
+[ "depend_type", "dependency_tables_on_functions", "DEP_VIEW"
]
+[ "id", "dependency_tables_on_functions", "DEP_VIEW" ]
[ "name", "dependency_tables_on_functions", "DEP_VIEW" ]
[ "type", "dependency_tables_on_functions", "DEP_VIEW" ]
-[ "id", "dependency_tables_on_functions", "DEP_VIEW" ]
-[ "depend_id", "dependency_tables_on_functions", "DEP_VIEW" ]
-[ "depend_type", "dependency_tables_on_functions", "DEP_VIEW"
]
[ "id", "dependency_views_on_functions", "DEP_VIEW" ]
[ "name", "dependency_views_on_functions", "DEP_VIEW" ]
[ "type", "dependency_views_on_functions", "DEP_VIEW" ]
@@ -890,12 +890,12 @@ Cleanup
[ "table_id", "dependency_tables_on_indexes", "DEP_VIEW" ]
[ "name", "dependency_tables_on_indexes", "DEP_VIEW" ]
[ "id", "dependency_columns_on_indexes", "DEP_VIEW" ]
-[ "name", "dependency_columns_on_indexes", "DEP_VIEW" ]
-[ "nr", "dependency_columns_on_indexes", "DEP_VIEW" ]
-[ "id", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "table_id", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "type", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "name", "dependency_columns_on_indexes", "DEP_VIEW" ]
+[ "id", "dependency_columns_on_indexes", "DEP_VIEW" ]
+[ "name", "dependency_columns_on_indexes", "DEP_VIEW" ]
+[ "nr", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "table_id", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "name", "dependency_columns_on_indexes", "DEP_VIEW" ]
[ "id", "dependency_tables_on_foreignkeys", "DEP_VIEW" ]
@@ -909,11 +909,11 @@ Cleanup
[ "name", "dependency_keys_on_foreignkeys", "DEP_VIEW" ]
[ "rkey", "dependency_keys_on_foreignkeys", "DEP_VIEW" ]
[ "id", "dependency_tables_on_procedures", "DEP_VIEW" ]
+[ "depend_id", "dependency_tables_on_procedures", "DEP_VIEW" ]
+[ "depend_type", "dependency_tables_on_procedures", "DEP_VIEW"
]
+[ "id", "dependency_tables_on_procedures", "DEP_VIEW" ]
[ "name", "dependency_tables_on_procedures", "DEP_VIEW" ]
[ "type", "dependency_tables_on_procedures", "DEP_VIEW" ]
-[ "id", "dependency_tables_on_procedures", "DEP_VIEW" ]
-[ "depend_id", "dependency_tables_on_procedures", "DEP_VIEW" ]
-[ "depend_type", "dependency_tables_on_procedures", "DEP_VIEW"
]
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list