Changeset: 7d3c2df56b66 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/7d3c2df56b66 Modified Files: sql/backends/monet5/rel_bin.c sql/server/rel_rel.c sql/server/rel_select.c sql/test/BugTracker-2022/Tests/All sql/test/SQLancer/Tests/All sql/test/subquery/Tests/subquery6.test Branch: default Log Message:
Merged with Jan2022 diffs (truncated from 389 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 @@ -4221,10 +4221,6 @@ sql_insert_check_null(backend *be, sql_t stmt *s = i; char *msg = NULL; - /* foreach column add predicate */ - if (add_column_predicate(be, c) != LOG_OK) - return sql_error(sql, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL); - if (!(s->key && s->nrcols == 0)) { s = stmt_selectnil(be, column(be, i)); s = stmt_aggr(be, s, NULL, NULL, cnt, 1, 0, 1); diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c --- a/sql/server/rel_rel.c +++ b/sql/server/rel_rel.c @@ -319,7 +319,7 @@ rel_bind_column( mvc *sql, sql_rel *rel, if (e) return exp_alias_or_copy(sql, exp_relname(e), cname, rel, e); } - if ((is_simple_project(rel->op) || is_groupby(rel->op)) && rel->l) { + if (is_simple_project(rel->op) && rel->l) { if (!is_processed(rel)) return rel_bind_column(sql, rel->l, cname, f, no_tname); } else if (is_set(rel->op)) { @@ -407,7 +407,7 @@ rel_bind_column2( mvc *sql, sql_rel *rel if (e) return exp_alias_or_copy(sql, tname, cname, rel, e); } - if ((is_simple_project(rel->op) || is_groupby(rel->op)) && rel->l) { + if (is_simple_project(rel->op) && rel->l) { if (!is_processed(rel)) return rel_bind_column2(sql, rel->l, tname, cname, f); } else if (is_set(rel->op)) { diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h --- a/sql/server/rel_rel.h +++ b/sql/server/rel_rel.h @@ -106,7 +106,7 @@ extern sql_rel *rel_or(mvc *sql, sql_rel extern sql_rel *rel_add_identity(mvc *sql, sql_rel *rel, sql_exp **exp); extern sql_rel *rel_add_identity2(mvc *sql, sql_rel *rel, sql_exp **exp); -extern sql_exp * rel_find_column( sql_allocator *sa, sql_rel *rel, const char *tname, const char *cname ); +extern sql_exp *rel_find_column( sql_allocator *sa, sql_rel *rel, const char *tname, const char *cname ); extern int rel_in_rel(sql_rel *super, sql_rel *sub); extern sql_rel *rel_parent(sql_rel *rel); 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 @@ -27,6 +27,13 @@ #define VALUE_FUNC(f) (f->func->type == F_FUNC || f->func->type == F_FILT) #define check_card(card,f) ((card == card_none && !f->res) || (CARD_VALUE(card) && f->res && VALUE_FUNC(f)) || card == card_loader || (card == card_relation && f->func->type == F_UNION)) +static void +query_processed(sql_query *query ) +{ + query -> last_exp = NULL; + query -> last_state = 0; +} + /* return all expressions, with table name == tname */ static list * rel_table_projections( mvc *sql, sql_rel *rel, char *tname, int level ) @@ -1133,9 +1140,7 @@ rel_column_ref(sql_query *query, sql_rel if (!exp && inner) if (!(exp = rel_bind_column(sql, inner, name, f, 0)) && sql->session->status == -ERR_AMBIGUOUS) return NULL; - if (!exp && inner && is_sql_having(f) && is_select(inner->op)) - inner = inner->l; - if (!exp && inner && (is_sql_having(f) || is_sql_aggr(f)) && is_groupby(inner->op)) + if (!exp && inner && is_sql_aggr(f) && is_groupby(inner->op)) if (!(exp = rel_bind_column(sql, inner->l, name, f, 0)) && sql->session->status == -ERR_AMBIGUOUS) return NULL; if (!exp && query && query_has_outer(query)) { @@ -1203,6 +1208,11 @@ rel_column_ref(sql_query *query, sql_rel if (!exp) /* If no column was found, try a variable or parameter */ exp = rel_exp_variable_on_scope(sql, NULL, name); + if (!exp) { + if (inner && !is_sql_aggr(f) && is_groupby(inner->op) && inner->l && (exp = rel_bind_column(sql, inner->l, name, f, 0))) + return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in query results without an aggregate function", name); + } + if (!exp) return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) "SELECT: identifier '%s' unknown", name); if (exp && inner && inner->card <= CARD_AGGR && exp->card > CARD_AGGR && (is_sql_sel(f) || is_sql_having(f)) && !is_sql_aggr(f)) @@ -1216,9 +1226,7 @@ rel_column_ref(sql_query *query, sql_rel if (!exp && rel && inner) if (!(exp = rel_bind_column2(sql, inner, tname, cname, f)) && sql->session->status == -ERR_AMBIGUOUS) return NULL; - if (!exp && inner && is_sql_having(f) && is_select(inner->op)) - inner = inner->l; - if (!exp && inner && (is_sql_having(f) || is_sql_aggr(f)) && is_groupby(inner->op)) + if (!exp && inner && is_sql_aggr(f) && is_groupby(inner->op)) if (!(exp = rel_bind_column2(sql, inner->l, tname, cname, f)) && sql->session->status == -ERR_AMBIGUOUS) return NULL; if (!exp && query && query_has_outer(query)) { @@ -1294,6 +1302,10 @@ rel_column_ref(sql_query *query, sql_rel exp = exp_param_or_declared(sql->sa, sa_strdup(sql->sa, var->sname), sa_strdup(sql->sa, var->name), &(var->var.tpe), 0); } } + if (!exp) { + if (inner && !is_sql_aggr(f) && is_groupby(inner->op) && inner->l && (exp = rel_bind_column2(sql, inner->l, tname, cname, f))) + return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s.%s' in query results without an aggregate function", tname, cname); + } if (!exp) return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42S22) "SELECT: no such column '%s.%s'", tname, cname); @@ -1304,6 +1316,10 @@ rel_column_ref(sql_query *query, sql_rel } else if (dlist_length(l) >= 3) { return sql_error(sql, 02, SQLSTATE(42000) "TODO: column names of level >= 3"); } + if (exp && !exp_is_atom(exp)) { + query->last_exp = exp; + query->last_state = f; + } return exp; } @@ -3626,6 +3642,9 @@ static sql_exp * } if (!subquery && groupby && groupby->op != op_groupby) { /* implicit groupby */ + if (query->last_exp && !is_sql_aggr(query->last_state)) { + return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s.%s' in query results without an aggregate function", exp_relname(query->last_exp), exp_name(query->last_exp)); + } res = groupby = rel_groupby(sql, groupby, NULL); } if (subquery) { @@ -5442,6 +5461,7 @@ rel_where_groupby_nodes(sql_query *query return NULL; } } + query_processed(query); if (rel && sn->groupby) { list *gbe, *sets = NULL; @@ -5468,6 +5488,7 @@ rel_where_groupby_nodes(sql_query *query if (rel->op != op_groupby) rel = rel_groupby(sql, rel, NULL); } + query_processed(query); return rel; } @@ -6016,6 +6037,7 @@ rel_joinquery_(sql_query *query, sql_rel if (inner && is_outerjoin(inner->op)) set_processed(inner); set_processed(rel); + query_processed(query); return rel; } @@ -6053,6 +6075,9 @@ sql_rel * rel_subquery(sql_query *query, sql_rel *rel, symbol *sq, exp_kind ek) { mvc *sql = query->sql; + sql_exp *last_exp = query->last_exp; + int last_state = query->last_state; + query_processed(query); int toplevel = 0; if (!stack_push_frame(sql, NULL)) @@ -6064,7 +6089,8 @@ rel_subquery(sql_query *query, sql_rel * rel = rel_query(query, rel, sq, toplevel, ek); stack_pop_frame(sql); - + query->last_exp = last_exp; + query->last_state = last_state; if (rel && ek.type == type_relation && ek.card < card_set && rel->card >= CARD_AGGR) return rel_zero_or_one(sql, rel, ek); return rel; diff --git a/sql/server/sql_query.h b/sql/server/sql_query.h --- a/sql/server/sql_query.h +++ b/sql/server/sql_query.h @@ -25,6 +25,8 @@ typedef struct stacked_query { typedef struct sql_query { mvc *sql; sql_stack *outer; + sql_exp *last_exp; + int last_state; } sql_query; extern sql_query *query_create(mvc *sql); diff --git a/sql/test/BugTracker-2013/Tests/cannot_use_columns_after_groupby.Bug-3340.test b/sql/test/BugTracker-2013/Tests/cannot_use_columns_after_groupby.Bug-3340.test --- a/sql/test/BugTracker-2013/Tests/cannot_use_columns_after_groupby.Bug-3340.test +++ b/sql/test/BugTracker-2013/Tests/cannot_use_columns_after_groupby.Bug-3340.test @@ -9,9 +9,8 @@ CREATE TABLE "sys"."filer_volumes" ( CONSTRAINT "filer_volumes_filer_volume_pkey" PRIMARY KEY ("filer", "volume") ) -query TI rowsort +statement error 42000!SELECT: cannot use non GROUP BY column 'toc.total_overcapacity' in query results without an aggregate function select "function", cast((sum(fv.claim_tb) - sum(fv.used_tb)) * 100 / toc.total_overcapacity as bigint) from sys.filer_volumes as fv, (select sum(claim_tb) - sum(used_tb) as total_overcapacity from sys.filer_volumes) as toc group by fv."function" order by fv."function" ----- statement ok drop table filer_volumes diff --git a/sql/test/BugTracker-2022/Tests/All b/sql/test/BugTracker-2022/Tests/All --- a/sql/test/BugTracker-2022/Tests/All +++ b/sql/test/BugTracker-2022/Tests/All @@ -1,2 +1,3 @@ date-calculations.Bug-7227 transaction-conflict.Bug-7228 +insert-not-null.Bug-7232 diff --git a/sql/test/BugTracker-2022/Tests/insert-not-null.Bug-7232.test b/sql/test/BugTracker-2022/Tests/insert-not-null.Bug-7232.test new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2022/Tests/insert-not-null.Bug-7232.test @@ -0,0 +1,45 @@ +@connection(id=1, username=monetdb, password=monetdb) +statement ok +CREATE TABLE test(k int NOT NULL) + +@connection(id=1) +statement ok +START TRANSACTION + +@connection(id=2, username=monetdb, password=monetdb) +statement ok +START TRANSACTION + +@connection(id=1) +statement ok +INSERT INTO test VALUES (1) + +@connection(id=2) +statement ok +INSERT INTO test VALUES (2) + +@connection(id=1) +statement ok +COMMIT + +@connection(id=2) +statement ok +COMMIT + +@connection(id=1) +query T +SELECT k FROM test +---- +1 +2 + +@connection(id=2) +query T +SELECT k FROM test +---- +1 +2 + +@connection(id=1) +statement ok +DROP TABLE test diff --git a/sql/test/SQLancer/Tests/All b/sql/test/SQLancer/Tests/All --- a/sql/test/SQLancer/Tests/All +++ b/sql/test/SQLancer/Tests/All @@ -14,7 +14,7 @@ sqlancer13 sqlancer14 sqlancer15 sqlancer16 -KNOWNFAIL?sqlancer17 +sqlancer17 sqlancer18 sqlancer19 sqlancer20 diff --git a/sql/test/SQLancer/Tests/sqlancer04.test b/sql/test/SQLancer/Tests/sqlancer04.test --- a/sql/test/SQLancer/Tests/sqlancer04.test +++ b/sql/test/SQLancer/Tests/sqlancer04.test @@ -156,10 +156,9 @@ create view v1(c0, c1) as (select distin statement ok create view v2(c0) as (select distinct coalesce(abs(interval '-1976292283' month), cast(greatest('Dnwxjm4btQ9cp&\c''a_', '(y7,{q?][NHU,') as interval month)) from t1, t0 where ((upper(''))not ilike(lower('''wAg_ z ''PPxXßgrd⍮G')))) -query T rowsort +statement error 42000!SELECT: cannot use non GROUP BY column 'v2.c0' in query results without an aggregate function select all v2.c0 from v2 right outer join v1 on (('8*By1q)*Oc<n')like(substr('', 1151312829, 406714197))) where (case v1.c0 when v1.c0 then interval '104279220' second end) in (interval '2129103763' second) group by timestamp '1970-01-21 14:05:46' ----- statement ok ROLLBACK @@ -394,10 +393,10 @@ 0.7223969464007746 0.6184216877785851 0.6479886625655562 -statement error 42S22!SELECT: no such column 't1.c1' +statement error 42000!SELECT: cannot use non GROUP BY column 't1.c1' in query results without an aggregate function select max(coalesce(interval '5' month, interval '2' month)) from t1 order by t1.c1 desc nulls last -statement error 42S22!SELECT: no such column 't1.c1' +statement error 42000!SELECT: cannot use non GROUP BY column 't1.c1' in query results without an aggregate function select sum(coalesce(coalesce(interval '5' month, interval '3' month), interval '2' month, coalesce(abs(interval '5' month), interval '2' month, case timestamp '1970-01-15 22:17:17' when timestamp '1970-01-03 22:17:36' then interval '5' month else interval '5' month end, interval '3' month), interval '3' month)) from t1 order by t1.c1 desc nulls last @@ -641,7 +640,7 @@ case 1108638173 when 1 then 'PS ' when 0 statement ok create view v40(vc0) as (values ((true) not in (false, false)), ("isauuid"(case 8 when 4 then 'F&' when 0 then '&' end))) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list