Changeset: 0e51230bc4d5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0e51230bc4d5
Branch: persistent_sketches
Log Message:

merged with default


diffs (161 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
@@ -1538,7 +1538,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
@@ -545,7 +545,7 @@ exp_cost(visitor *v, sql_exp *e, ulng ma
                BUN n = l->nrcols + r->nrcols; /* not correct includes join 
exps */
                cost = ( (dbl)lcard + (dbl)rcard + (lcard*rcard * sel * n * 8) 
);
                if (VERBOSE) {
-                       printf("cost %F %F %lu %lu ", cost, sel, lcard, rcard);
+                       printf("cost %F %F " BUNFMT " " BUNFMT " ", cost, sel, 
lcard, rcard);
                        _exp_print(v->sql, e);
                }
        }
@@ -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]

Reply via email to