Changeset: 9a6bb959f8de for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9a6bb959f8de
Modified Files:
sql/backends/monet5/rel_physical.c
sql/backends/monet5/rel_pphash.c
Branch: manti
Log Message:
merged with default
diffs (152 lines):
diff --git a/sql/backends/monet5/rel_physical.c
b/sql/backends/monet5/rel_physical.c
--- a/sql/backends/monet5/rel_physical.c
+++ b/sql/backends/monet5/rel_physical.c
@@ -553,6 +553,8 @@ rel_probehash(visitor *v, sql_rel *rel,
{
/* todo inplace for hash sharing */
sql_rel *r = rel_create(v->sql->sa);
+ r->lunique = rel->lunique;
+ r->runique = rel->runique;
if (0 && rel_is_ref(rel)) {
sql_rel *l = r;
*l = *rel;
@@ -588,6 +590,8 @@ rel_buildhash(visitor *v, sql_rel *rel,
}
/* Inplace for hash sharing */
sql_rel *r = rel_create(v->sql->sa);
+ r->lunique = rel->lunique;
+ r->runique = rel->runique;
if (0 && rel_is_ref(rel)) {
sql_rel *l = r;
*l = *rel;
diff --git a/sql/backends/monet5/rel_pphash.c b/sql/backends/monet5/rel_pphash.c
--- a/sql/backends/monet5/rel_pphash.c
+++ b/sql/backends/monet5/rel_pphash.c
@@ -1581,7 +1581,7 @@ rel2bin_oahash_semi(backend *be, sql_rel
rids = stmt_project(be, sel, rids);
}
stmt *c = stmt_mirror(be, bin_find_smallest_column(be,
probe_sub));
- if (rel->op == op_anti && nulls) {
+ if (rel->op == op_anti && nulls && ht_empty) {
/* select nulls only if hash side not empty */
stmt *f = stmt_const(be, nulls, stmt_bool(be, 0));
stmt *s = stmt_thetaselect(be, f, NULL, ht_empty, "==",
sql_fetch_localtype(TYPE_bit));
diff --git a/sql/server/rel_optimize_join.c b/sql/server/rel_optimize_join.c
--- a/sql/server/rel_optimize_join.c
+++ b/sql/server/rel_optimize_join.c
@@ -1899,6 +1899,9 @@ find_fk( mvc *sql, list *rels, list *exp
static sql_rel *
rel_join_use_fk(visitor *v, sql_rel *rel)
{
+ /* Don't look at the same relation twice */
+ if (are_fkeys_found(rel->used))
+ return rel;
if ((is_semi(rel->op)) && !list_empty(rel->exps)) {
list *exps = rel->exps;
list *rels = sa_list(v->sql->sa);
@@ -1929,12 +1932,10 @@ rel_join_use_fk(visitor *v, sql_rel *rel
list *rels = sa_list(ta);
get_relations(v, rel, rels);
/* mark done */
- if (v->opt > 0)
- for (node *rn = rels->h; rn; rn = rn->next) {
- sql_rel *r = rn->data;
- r->opt = v->opt;
- }
-
+ for (node *rn = rels->h; rn; rn = rn->next) {
+ sql_rel *r = rn->data;
+ r->used |= fkeys_found;
+ }
if (list_length(rels) > 1) {
find_fk( v->sql, rels, exps);
diff --git a/sql/server/rel_optimizer_private.h
b/sql/server/rel_optimizer_private.h
--- a/sql/server/rel_optimizer_private.h
+++ b/sql/server/rel_optimizer_private.h
@@ -47,6 +47,7 @@ typedef struct sql_optimizer {
#define rewrite_gt_zero_used (1 << 5)
#define unnest_used (1 << 6)
#define rewrite_physical_used (1 << 7)
+#define fkeys_found (1 << 8)
#define is_rewrite_fix_count_used(X) ((X & rewrite_fix_count_used) ==
rewrite_fix_count_used)
#define is_rewrite_values_used(X) ((X & rewrite_values_used) ==
rewrite_values_used)
@@ -56,6 +57,7 @@ typedef struct sql_optimizer {
#define is_rewrite_gt_zero_used(X) ((X & rewrite_gt_zero_used) ==
rewrite_gt_zero_used)
#define is_unnest_used(X) ((X & unnest_used) ==
unnest_used)
#define is_physical_done(X) ((X &
rewrite_physical_used) == rewrite_physical_used)
+#define are_fkeys_found(X) ((X & fkeys_found) ==
fkeys_found)
/* At the moment the following optimizers 'packs' can be disabled,
later we could disable individual optimizers from the 'pack' */
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
@@ -1214,6 +1214,8 @@ rel_project(allocator *sa, sql_rel *l, l
rel->exps = e;
rel->card = exps_card(e);
if (l) {
+ rel->lunique = l->lunique;
+ rel->runique = l->runique;
rel->card = l->card;
if (e)
rel->nrcols = list_length(e);
diff --git a/sql/test/BugTracker-2025/Tests/7729-tail_type-crash.test
b/sql/test/BugTracker-2025/Tests/7729-tail_type-crash.test
--- a/sql/test/BugTracker-2025/Tests/7729-tail_type-crash.test
+++ b/sql/test/BugTracker-2025/Tests/7729-tail_type-crash.test
@@ -2,3 +2,54 @@ query I
SELECT ( WITH x ( x ) AS ( SELECT DISTINCT 1 ) SELECT ( SELECT x FROM x WHERE
x = ( SELECT ( CASE WHEN x THEN x END ) WHERE ( SELECT x FROM x WHERE ( x , (
SELECT ( WITH x ( x ) AS ( SELECT DISTINCT 1 ) SELECT ( SELECT x FROM x WHERE x
= ( SELECT ( CASE WHEN x THEN x END ) WHERE 1 + 1 + 1 + 1 + 1 + 1 + 1 +
9223372036854775808.000000 + 1 + 1 = ( SELECT x FROM x ) AND x GROUP BY 1
HAVING ( - 'x' >= x IS NOT NULL = ( 1 < x AND x < 'x' ) AND x = 8 ) ) GROUP BY
x HAVING ( 9 = -1 AND x = 8 ) ) FROM x ) LIMIT 10 OFFSET 0 ) ) NOT IN ( SELECT
x , x FROM x WHERE x > 1 ) ) AND x ) ) FROM x )
----
1
+
+query I
+WITH x ( x ) AS ( SELECT DISTINCT 1 ) SELECT ( SELECT x FROM x WHERE ( x , (
SELECT x FROM x where false) ) NOT IN ( SELECT x , x FROM x WHERE FALSE ) )
FROM x;
+----
+1
+
+query I
+WITH x ( x ) AS ( SELECT DISTINCT 1 ) SELECT x FROM x WHERE ( x , ( SELECT x
FROM x where false) ) NOT IN ( SELECT x , x FROM x WHERE FALSE ) ;
+----
+1
+
+query I
+WITH x ( x ) AS ( SELECT DISTINCT 1 ) SELECT ( SELECT x FROM x WHERE ( x , (
SELECT x FROM x where false) ) NOT IN ( SELECT null , null FROM x) ) FROM x;
+----
+NULL
+
+query I
+WITH x ( x ) AS ( SELECT DISTINCT 1 ) SELECT x FROM x WHERE ( x , ( SELECT x
FROM x where false) ) NOT IN ( SELECT null , null FROM x) ;
+----
+
+query I
+WITH x ( x ) AS ( SELECT DISTINCT 1 ) SELECT ( SELECT x FROM x WHERE ( x , (
SELECT x FROM x where false) ) NOT IN ( (SELECT null , null) ) ) FROM x;
+----
+NULL
+
+query I
+WITH x ( x ) AS ( SELECT DISTINCT 1 ) SELECT x FROM x WHERE ( x , ( SELECT x
FROM x where false) ) NOT IN ( (SELECT null , null) ) ;
+----
+
+query I
+WITH x ( x ) AS ( SELECT DISTINCT 1 ) SELECT x FROM x WHERE ( x , (select null
from x)) NOT IN ( SELECT null , null FROM x);
+----
+
+query I
+WITH x ( x ) AS ( SELECT DISTINCT 1 ) SELECT x FROM x WHERE ( x , null ) NOT
IN ( SELECT x , x FROM x WHERE FALSE ) ;
+----
+1
+
+query I
+WITH x ( x ) AS ( SELECT DISTINCT 1 ) SELECT x FROM x WHERE ( x , null ) NOT
IN ( SELECT null , null FROM x) ;
+----
+
+query I
+WITH x ( x ) AS ( SELECT DISTINCT 1 ) SELECT ( SELECT x FROM x WHERE ( x , (
SELECT ( SELECT x FROM x WHERE false ) FROM x ) ) NOT IN ( SELECT x , x FROM x
WHERE FALSE) ) FROM x;
+----
+1
+
+query I
+WITH x ( x ) AS ( SELECT DISTINCT 1 ) SELECT ( SELECT x FROM x WHERE ( x , (
SELECT ( SELECT x FROM x WHERE false ) FROM x ) ) NOT IN ( SELECT x , x FROM x
WHERE FALSE ) ) FROM x;
+----
+1
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]