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]