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]

Reply via email to