Changeset: 5bb1695ac04e for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5bb1695ac04e
Modified Files:
        sql/backends/monet5/generator/90_generator.sql
        sql/backends/monet5/generator/Tests/generator00.sql
        sql/backends/monet5/generator/Tests/generator00.stable.out
        sql/backends/monet5/generator/Tests/generator04.sql
        sql/backends/monet5/generator/generator.c
Branch: generator
Log Message:

Consistent handling of 2-arg generators
The default step size is +-1 depending on the sequence direction.
Timeseries always require 3 args.


diffs (179 lines):

diff --git a/sql/backends/monet5/generator/90_generator.sql 
b/sql/backends/monet5/generator/90_generator.sql
--- a/sql/backends/monet5/generator/90_generator.sql
+++ b/sql/backends/monet5/generator/90_generator.sql
@@ -59,19 +59,3 @@ external name vault.generate_series;
 create function sys.generate_series(first timestamp, last timestamp, stepsize 
interval second)
 returns table (value timestamp)
 external name vault.generate_series;
-
--- create function sys.generate_series(first timestamp, last timestamp, 
stepsize interval minute)
--- returns table (value timestamp)
--- external name vault.generate_series;
--- 
--- create function sys.generate_series(first timestamp, last timestamp, 
stepsize interval hour)
--- returns table (value timestamp)
--- external name vault.generate_series;
--- 
--- create function sys.generate_series(first timestamp, last timestamp, 
stepsize interval day)
--- returns table (value timestamp)
--- external name vault.generate_series;
--- 
--- create function sys.generate_series(first timestamp, last timestamp, 
stepsize interval month)
--- returns table (value timestamp)
--- external name vault.generate_series;
diff --git a/sql/backends/monet5/generator/Tests/generator00.sql 
b/sql/backends/monet5/generator/Tests/generator00.sql
--- a/sql/backends/monet5/generator/Tests/generator00.sql
+++ b/sql/backends/monet5/generator/Tests/generator00.sql
@@ -1,5 +1,9 @@
+select * from generate_series(0,10);
+
 select * from generate_series(0,10,2);
 
+select * from generate_series(0,10) where value <5;
+
 select * from generate_series(0,10,2) where value <5;
 
 select * from generate_series(0,10,2) where value =4;
@@ -8,8 +12,12 @@ select * from generate_series(0,10,2) as
 
 select * from generate_series(0,10,2) as v where value <7 and value >3 and 
value <=6 and value >=4;
 
+select * from generate_series(10,0);
+
 select * from generate_series(10,0,-2);
 
+select * from generate_series(10,0) where value <5;
+
 select * from generate_series(10,0,-2) where value <5;
 
 select * from generate_series(10,0,-2) where value = 6;
diff --git a/sql/backends/monet5/generator/Tests/generator00.stable.out 
b/sql/backends/monet5/generator/Tests/generator00.stable.out
--- a/sql/backends/monet5/generator/Tests/generator00.stable.out
+++ b/sql/backends/monet5/generator/Tests/generator00.stable.out
@@ -52,6 +52,21 @@ Ready.
 # 18:09:06 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-27022" "--port=30145"
 # 18:09:06 >  
 
+#select * from generate_series(0,10);
+% . # table_name
+% value # name
+% tinyint # type
+% 1 # length
+[ 0    ]
+[ 1    ]
+[ 2    ]
+[ 3    ]
+[ 4    ]
+[ 5    ]
+[ 6    ]
+[ 7    ]
+[ 8    ]
+[ 9    ]
 #select * from generate_series(0,10,2);
 % . # table_name
 % value # name
diff --git a/sql/backends/monet5/generator/Tests/generator04.sql 
b/sql/backends/monet5/generator/Tests/generator04.sql
--- a/sql/backends/monet5/generator/Tests/generator04.sql
+++ b/sql/backends/monet5/generator/Tests/generator04.sql
@@ -6,3 +6,7 @@ select * from generate_series(false,true
 select * from generate_series(null,null,1);
 select * from generate_series(10,null,1);
 select * from generate_series(null,10,1);
+
+select * from generate_series(
+       timestamp '2008-03-01 00:00',
+       timestamp '2008-03-04 12:00');
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
@@ -180,7 +180,9 @@ VLTgenerator_noop(Client cntxt, MalBlkPt
                TPE *v, f, l, s;                                        \
                f = *(TPE*) getArgReference(stk, pci, 1);               \
                l = *(TPE*) getArgReference(stk, pci, 2);               \
-               s = pci->argc == 3 ? 1 : *(TPE*) getArgReference(stk, pci, 3); \
+               if ( pci->argc == 3) \
+                       s = f<l? (TPE) 1: (TPE)-1;\
+               else s =  *(TPE*) getArgReference(stk,pci, 3);\
                if (s == 0 || (s > 0 && f > l) || (s < 0 && f < l) || f == 
TPE##_nil || l == TPE##_nil)\
                        throw(MAL, "generator.table",                   \
                              "Illegal generator range");               \
@@ -245,6 +247,8 @@ VLTgenerator_table(Client cntxt, MalBlkP
                                      "Illegal generator expression range");
                        f = *(timestamp *) getArgReference(stk, pci, 1);
                        l = *(timestamp *) getArgReference(stk, pci, 2);
+                       if ( pci->argc == 3) 
+                                       throw(MAL,"generator.table","Timestamp 
step missing");
                        s = *(lng *) getArgReference(stk, pci, 3);
                        if (s == 0 ||
                            (s > 0 && ret.val.btval > 0) ||
@@ -319,7 +323,9 @@ findLastAssign(MalBlkPtr mb, InstrPtr pc
                                                                        \
                f = * (TPE *) getArgReference(stk, p, 1);               \
                l = * (TPE *) getArgReference(stk, p, 2);               \
-               s = p->argc == 3 ? 1 : * (TPE *) getArgReference(stk, p, 3); \
+               if ( p->argc == 3) \
+                       s = f<l? (TPE) 1: (TPE)-1;\
+               else s = * (TPE *) getArgReference(stk, p, 3); \
                if (s == 0 || (s > 0 && f > l) || (s < 0 && f < l) || f == 
TPE##_nil || l == TPE##_nil) \
                        throw(MAL, "generator.subselect",               \
                              "Illegal generator range");               \
@@ -436,6 +442,8 @@ VLTgenerator_subselect(Client cntxt, Mal
 
                        tsf = *(timestamp *) getArgReference(stk, p, 1);
                        tsl = *(timestamp *) getArgReference(stk, p, 2);
+                       if ( p->argc == 3) 
+                                       throw(MAL,"generator.table","Timestamp 
step missing");
                        tss = *(lng *) getArgReference(stk, p, 3);
                        if ( tss == 0 || 
                                timestamp_isnil(tsf) || timestamp_isnil(tsl) ||
@@ -606,7 +614,9 @@ float nextafterf(float x, float y);
        BUN j; oid *v;\
        f = *(TPE*) getArgReference(stk,p, 1);\
        l = *(TPE*) getArgReference(stk,p, 2);\
-       s = pci->argc == 3 ? 1:  *(TPE*) getArgReference(stk,p, 3);\
+       if ( p->argc == 3) \
+               s = f<l? (TPE) 1: (TPE)-1;\
+       else s =  *(TPE*) getArgReference(stk,p, 3);\
        if( s == 0 || (f<l && s < 0) || (f>l && s> 0)) \
                throw(MAL,"generator.thetasubselect","Illegal range");\
        cap = (BUN)(ABS(l-f)/ABS(s));\
@@ -694,6 +704,8 @@ str VLTgenerator_thetasubselect(Client c
 
                        f = *(timestamp*) getArgReference(stk,p, 1);
                        l = *(timestamp*) getArgReference(stk,p, 2);
+                       if ( p->argc == 3) 
+                                       throw(MAL,"generator.table","Timestamp 
step missing");
                        s = *(lng*) getArgReference(stk,p, 3);
                        if ( s == 0 || 
                                 (s > 0 && (f.days > l.days || (f.days == 
l.days && f.msecs > l.msecs) )) ||
@@ -766,7 +778,9 @@ wrapup:
        TPE *v;\
        f = *(TPE*) getArgReference(stk,p, 1);\
        l = *(TPE*) getArgReference(stk,p, 2);\
-       s = *(TPE*) getArgReference(stk,p, 3);\
+       if ( p->argc == 3) \
+               s = f<l? (TPE) 1: (TPE)-1;\
+       else s = * (TPE *) getArgReference(stk, p, 3); \
        if ( s == 0 || (f> l && s>0) || (f<l && s < 0))\
                throw(MAL,"generator.leftfetchjoin","Illegal range");\
        bn = BATnew(TYPE_void, TYPE_##TPE, cnt, TRANSIENT);\
@@ -823,6 +837,8 @@ str VLTgenerator_leftfetchjoin(Client cn
                        timestamp *v;
                        f = *(timestamp*) getArgReference(stk,p, 1);
                        l = *(timestamp*) getArgReference(stk,p, 2);
+                       if ( p->argc == 3) 
+                                       throw(MAL,"generator.table","Timestamp 
step missing");
                        s =  *(lng*) getArgReference(stk,p, 3);
                        if ( s == 0 ||
                                (s< 0 &&        (f.days< l.days || (f.days == 
l.days && f.msecs < l.msecs))) ||
@@ -872,7 +888,9 @@ str VLTgenerator_leftfetchjoin(Client cn
        { TPE f,l,s; TPE *v; BUN w;\
        f = *(TPE*) getArgReference(stk,p, 1);\
        l = *(TPE*) getArgReference(stk,p, 2);\
-       s = *(TPE*) getArgReference(stk,p, 3);\
+       if ( p->argc == 3) \
+               s = f<l? (TPE) 1: (TPE)-1;\
+       else s = * (TPE *) getArgReference(stk, p, 3); \
        incr = s > 0;\
        v = (TPE*) Tloc(bl,BUNfirst(bl));\
        if ( s == 0 || (f> l && s>0) || (f<l && s < 0))\
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to