Changeset: 7827b760ded8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7827b760ded8
Added Files:
        sql/test/BugTracker-2025/Tests/7735-crossproduct-update.test
        sql/test/BugTracker-2025/Tests/7736-scale-reduction-crash.test
Modified Files:
        sql/server/rel_optimize_exps.c
        sql/server/rel_updates.c
        sql/test/BugTracker-2025/Tests/All
        sql/test/astro/Tests/astro.test
Branch: Mar2025
Log Message:

fixes for issues #7735 and #7736

check subqueries for updates to return a single row (per left hand side)
reduce scale to the max of the current scale


diffs (128 lines):

diff --git a/sql/server/rel_optimize_exps.c b/sql/server/rel_optimize_exps.c
--- a/sql/server/rel_optimize_exps.c
+++ b/sql/server/rel_optimize_exps.c
@@ -381,11 +381,11 @@ bind_simplify_math(visitor *v, global_pr
  * types).
  */
 
-#define reduce_scale_tpe(tpe, uval) \
+#define reduce_scale_tpe(tpe, uval, scale) \
        do { \
                tpe v = uval; \
                if (v != 0) { \
-                       while( (v/10)*10 == v ) { \
+                       while(i < (int)scale && (v/10)*10 == v ) { \
                                i++; \
                                v /= 10; \
                        } \
@@ -406,17 +406,17 @@ reduce_scale(mvc *sql, atom *a)
 
 #ifdef HAVE_HGE
        if (a->data.vtype == TYPE_hge) {
-               reduce_scale_tpe(hge, a->data.val.hval);
+               reduce_scale_tpe(hge, a->data.val.hval, a->tpe.scale);
        } else
 #endif
        if (a->data.vtype == TYPE_lng) {
-               reduce_scale_tpe(lng, a->data.val.lval);
+               reduce_scale_tpe(lng, a->data.val.lval, a->tpe.scale);
        } else if (a->data.vtype == TYPE_int) {
-               reduce_scale_tpe(int, a->data.val.ival);
+               reduce_scale_tpe(int, a->data.val.ival, a->tpe.scale);
        } else if (a->data.vtype == TYPE_sht) {
-               reduce_scale_tpe(sht, a->data.val.shval);
+               reduce_scale_tpe(sht, a->data.val.shval, a->tpe.scale);
        } else if (a->data.vtype == TYPE_bte) {
-               reduce_scale_tpe(bte, a->data.val.btval);
+               reduce_scale_tpe(bte, a->data.val.btval, a->tpe.scale);
        }
        if (i) {
                na = atom_int(sql->sa, &a->tpe, nval);
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -1109,6 +1109,7 @@ update_generate_assignments(sql_query *q
                                r->flag |= MERGE_LEFT;
                                set_dependent(r);
                                set_processed(r);
+                               set_single(r);
                                if (single) {
                                        v = exp_column(sql->sa, NULL, 
exp_name(v), exp_subtype(v), v->card, has_nil(v), is_unique(v), is_intern(v));
                                        rel_val = NULL;
diff --git a/sql/test/BugTracker-2025/Tests/7735-crossproduct-update.test 
b/sql/test/BugTracker-2025/Tests/7735-crossproduct-update.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2025/Tests/7735-crossproduct-update.test
@@ -0,0 +1,17 @@
+statement ok
+CREATE TABLE v0 ( v1 INT , v2 VARCHAR ( 4 ) )
+
+statement ok rowcount 1
+INSERT INTO v0 DEFAULT VALUES 
+
+statement ok rowcount 1
+INSERT INTO v0 VALUES ( 7 , 'x' )
+
+statement ok rowcount 1
+INSERT INTO v0 VALUES ( 18 , 'x' )
+
+statement ok rowcount 1
+INSERT INTO v0 VALUES ( 90 , NULL )
+
+statement error GDK reported error: BATsubcross: more than one match
+UPDATE v0 SET ( v2 , v1 ) = ( SELECT v1 + 90 , v1 FROM v0 )
diff --git a/sql/test/BugTracker-2025/Tests/7736-scale-reduction-crash.test 
b/sql/test/BugTracker-2025/Tests/7736-scale-reduction-crash.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2025/Tests/7736-scale-reduction-crash.test
@@ -0,0 +1,29 @@
+statement ok
+CREATE TABLE v0 ( v1 INT , v2 VARCHAR ( 255 ) ) 
+
+statement ok rowcount 1
+INSERT INTO v0 VALUES ( 6249863.000000 , 34483237.000000 )
+
+statement ok rowcount 1
+INSERT INTO v0 VALUES ( 6314442.000000 , 45506563.000000 )
+
+statement ok rowcount 1
+INSERT INTO v0 VALUES ( NULL , 26065318.000000 )
+
+statement ok rowcount 1
+INSERT INTO v0 VALUES ( 58834911.000000 , NULL )
+
+statement ok rowcount 1
+INSERT INTO v0 VALUES ( NULL , NULL )
+
+query II
+SELECT DISTINCT 75472850.000000 * v1 , v1 + v1 FROM v0
+----
+471694972719550
+12499726
+476568933899700
+12628884
+NULL
+NULL
+4440438412666350
+117669822
diff --git a/sql/test/BugTracker-2025/Tests/All 
b/sql/test/BugTracker-2025/Tests/All
--- a/sql/test/BugTracker-2025/Tests/All
+++ b/sql/test/BugTracker-2025/Tests/All
@@ -43,3 +43,5 @@ 7702-stmt_convert_cands
 7706-set-user
 7730-generate-series-month-int
 7732-table-exp-issue
+7735-crossproduct-update
+7736-scale-reduction-crash
diff --git a/sql/test/astro/Tests/astro.test b/sql/test/astro/Tests/astro.test
--- a/sql/test/astro/Tests/astro.test
+++ b/sql/test/astro/Tests/astro.test
@@ -69,7 +69,7 @@ table("sys"."fluxz") [ "fluxz"."runcat" 
 update(
 | & REF 1 
 | project (
-| | left outer join (
+| | single left outer join (
 | | | & REF 1 ,
 | | | single project (
 | | | | select (
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to