Changeset: 076315b6418b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/076315b6418b
Modified Files:
sql/backends/monet5/generator/Tests/generator00.test
sql/backends/monet5/generator/Tests/generator03.test
sql/backends/monet5/generator/Tests/generator05.test
sql/backends/monet5/generator/generator.c
Branch: Dec2025
Log Message:
Fix some issues with generate_series.
- Off-by-one error in thetaselect;
- Date series with negative step was not generated at all.
diffs (truncated from 359 to 300 lines):
diff --git a/sql/backends/monet5/generator/Tests/generator00.test
b/sql/backends/monet5/generator/Tests/generator00.test
--- a/sql/backends/monet5/generator/Tests/generator00.test
+++ b/sql/backends/monet5/generator/Tests/generator00.test
@@ -38,6 +38,12 @@ select * from generate_series(0,10,2) wh
4
query I rowsort
+select * from sys.generate_series(10,0,-3) where value < 6
+----
+1
+4
+
+query I rowsort
select * from generate_series(0,10,2) where value =4
----
4
diff --git a/sql/backends/monet5/generator/Tests/generator03.test
b/sql/backends/monet5/generator/Tests/generator03.test
--- a/sql/backends/monet5/generator/Tests/generator03.test
+++ b/sql/backends/monet5/generator/Tests/generator03.test
@@ -66,6 +66,7 @@ select * from generate_series(
cast( '-10' as interval hour))
where value < timestamp '2008-03-02 00:00'
----
+2008-03-01 04:00:00
2008-03-01 14:00:00
query T rowsort
@@ -154,3 +155,9 @@ and value > timestamp '2008-03-01 11:00'
2008-03-02 06:00:00
2008-03-02 16:00:00
+query I rowsort
+select * from sys.generate_series(10,0,-3) where value < 6
+----
+1
+4
+
diff --git a/sql/backends/monet5/generator/Tests/generator05.test
b/sql/backends/monet5/generator/Tests/generator05.test
--- a/sql/backends/monet5/generator/Tests/generator05.test
+++ b/sql/backends/monet5/generator/Tests/generator05.test
@@ -6,6 +6,7 @@ select * from generate_series(date '2023
2023-03-01
2023-04-01
2023-05-01
+2023-06-01
query T nosort
select * from generate_series(date '2023-01-01',date '2024-01-01', interval
'15' day) where value < date '2023-06-06'
@@ -22,3 +23,163 @@ select * from generate_series(date '2023
2023-05-16
2023-05-31
+query T rowsort
+select * from sys.generate_series(date '2026-04-1',date '2026-01-10', interval
-'1' month)
+----
+2026-02-01
+2026-03-01
+2026-04-01
+
+query T rowsort
+select * from sys.generate_series(date '2026-04-1',date '2026-01-10', interval
-'1' day)
+----
+2026-01-11
+2026-01-12
+2026-01-13
+2026-01-14
+2026-01-15
+2026-01-16
+2026-01-17
+2026-01-18
+2026-01-19
+2026-01-20
+2026-01-21
+2026-01-22
+2026-01-23
+2026-01-24
+2026-01-25
+2026-01-26
+2026-01-27
+2026-01-28
+2026-01-29
+2026-01-30
+2026-01-31
+2026-02-01
+2026-02-02
+2026-02-03
+2026-02-04
+2026-02-05
+2026-02-06
+2026-02-07
+2026-02-08
+2026-02-09
+2026-02-10
+2026-02-11
+2026-02-12
+2026-02-13
+2026-02-14
+2026-02-15
+2026-02-16
+2026-02-17
+2026-02-18
+2026-02-19
+2026-02-20
+2026-02-21
+2026-02-22
+2026-02-23
+2026-02-24
+2026-02-25
+2026-02-26
+2026-02-27
+2026-02-28
+2026-03-01
+2026-03-02
+2026-03-03
+2026-03-04
+2026-03-05
+2026-03-06
+2026-03-07
+2026-03-08
+2026-03-09
+2026-03-10
+2026-03-11
+2026-03-12
+2026-03-13
+2026-03-14
+2026-03-15
+2026-03-16
+2026-03-17
+2026-03-18
+2026-03-19
+2026-03-20
+2026-03-21
+2026-03-22
+2026-03-23
+2026-03-24
+2026-03-25
+2026-03-26
+2026-03-27
+2026-03-28
+2026-03-29
+2026-03-30
+2026-03-31
+2026-04-01
+
+query T rowsort
+select * from sys.generate_series(date '2026-04-1',date '2026-01-10', interval
-'1' month) where value < date '2026-03-10'
+----
+2026-02-01
+2026-03-01
+
+query T rowsort
+select * from sys.generate_series(date '2026-04-1',date '2026-01-10', interval
-'1' day) where value < date '2026-03-10'
+----
+2026-01-11
+2026-01-12
+2026-01-13
+2026-01-14
+2026-01-15
+2026-01-16
+2026-01-17
+2026-01-18
+2026-01-19
+2026-01-20
+2026-01-21
+2026-01-22
+2026-01-23
+2026-01-24
+2026-01-25
+2026-01-26
+2026-01-27
+2026-01-28
+2026-01-29
+2026-01-30
+2026-01-31
+2026-02-01
+2026-02-02
+2026-02-03
+2026-02-04
+2026-02-05
+2026-02-06
+2026-02-07
+2026-02-08
+2026-02-09
+2026-02-10
+2026-02-11
+2026-02-12
+2026-02-13
+2026-02-14
+2026-02-15
+2026-02-16
+2026-02-17
+2026-02-18
+2026-02-19
+2026-02-20
+2026-02-21
+2026-02-22
+2026-02-23
+2026-02-24
+2026-02-25
+2026-02-26
+2026-02-27
+2026-02-28
+2026-03-01
+2026-03-02
+2026-03-03
+2026-03-04
+2026-03-05
+2026-03-06
+2026-03-07
+2026-03-08
+2026-03-09
+
diff --git a/sql/backends/monet5/generator/generator.c
b/sql/backends/monet5/generator/generator.c
--- a/sql/backends/monet5/generator/generator.c
+++ b/sql/backends/monet5/generator/generator.c
@@ -248,12 +248,23 @@ VLTgenerator_table_(BAT **result, Client
throw(MAL, "generator.table", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
v = (date *) Tloc(bn, 0);
BUN c;
- for (c = 0; f < l; c++) {
- *v++ = f;
- f = date_add_month(f, s);
- if (is_date_nil(f)) {
- BBPreclaim(bn);
- throw(MAL, "generator.table",
SQLSTATE(22003) "overflow in calculation");
+ if (s < 0) {
+ for (c = 0; f > l; c++) {
+ *v++ = f;
+ f = date_add_month(f, s);
+ if (is_date_nil(f)) {
+ BBPreclaim(bn);
+ throw(MAL, "generator.table",
SQLSTATE(22003) "overflow in calculation");
+ }
+ }
+ } else {
+ for (c = 0; f < l; c++) {
+ *v++ = f;
+ f = date_add_month(f, s);
+ if (is_date_nil(f)) {
+ BBPreclaim(bn);
+ throw(MAL, "generator.table",
SQLSTATE(22003) "overflow in calculation");
+ }
}
}
n = c;
@@ -284,12 +295,23 @@ VLTgenerator_table_(BAT **result, Client
throw(MAL, "generator.table", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
v = (date *) Tloc(bn, 0);
BUN c;
- for (c = 0; c < n && f < l; c++) {
- *v++ = f;
- f = date_add_day(f, (int) s);
- if (is_date_nil(f)) {
- BBPreclaim(bn);
- throw(MAL, "generator.table",
SQLSTATE(22003) "overflow in calculation");
+ if (s < 0) {
+ for (c = 0; c < n && f > l; c++) {
+ *v++ = f;
+ f = date_add_day(f, (int) s);
+ if (is_date_nil(f)) {
+ BBPreclaim(bn);
+ throw(MAL, "generator.table",
SQLSTATE(22003) "overflow in calculation");
+ }
+ }
+ } else {
+ for (c = 0; c < n && f < l; c++) {
+ *v++ = f;
+ f = date_add_day(f, (int) s);
+ if (is_date_nil(f)) {
+ BBPreclaim(bn);
+ throw(MAL, "generator.table",
SQLSTATE(22003) "overflow in calculation");
+ }
}
}
n = c;
@@ -875,7 +897,7 @@ VLTgenerator_subselect(Client cntxt, Mal
BBPreclaim(bn);
\
throw(MAL,"generator.thetaselect", SQLSTATE(42000)
"Unknown operator"); \
}
\
- for(j=0;j<cap;j++, f+=s, o++)
\
+ for(j=0;j<=cap;j++, f+=s, o++) {
\
if (nil_matches && is_##TPE##_nil(low) ? anti :
\
((is_##TPE##_nil(low) || f >= low) &&
(is_##TPE##_nil(hgh) || f <= hgh)) != anti){ \
if(cand == NULL || canditer_contains(&ci, o)) {
\
@@ -883,6 +905,9 @@ VLTgenerator_subselect(Client cntxt, Mal
c++;
\
}
\
}
\
+ if (f == l)
\
+ break;
\
+ }
\
} while (0)
@@ -950,7 +975,7 @@ VLTgenerator_thetasubselect(Client cntxt
hgh = low = date_nil;
if ( strcmp(oper,"<") == 0){
hgh= *getArgReference_TYPE(stk,pci,3, date);
- hgh = date_add_month(hgh, -1);
+ hgh = date_add_day(hgh, -1);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]