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