Changeset: 37f7e790a7f5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/37f7e790a7f5
Modified Files:
sql/backends/monet5/generator/generator.c
sql/backends/monet5/mal_backend.c
sql/backends/monet5/rel_bin.c
sql/backends/monet5/rel_physical.c
sql/include/sql_catalog.h
sql/storage/store.c
Branch: pp_hashjoin
Log Message:
more generators
diffs (truncated from 382 to 300 lines):
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
@@ -1782,14 +1782,10 @@ VLTgenerator_rangejoin(Client cntxt, Mal
typedef struct generator {
Sink s;
int type;
+ int steptype;
int part_size;
-#ifdef HAVE_HGE
- hge cnt;
- hge cur;
-#else
- lng cnt;
- lng cur;
-#endif
+ BUN cnt;
+ BUN cur;
ValRecord first;
ValRecord limit;
ValRecord step;
@@ -1811,10 +1807,12 @@ generator_done(generator *g, int wid, in
(void)redo;
(void)wid;
(void)nr_workers;
+ bool res = false;
MT_lock_set(&g->l);
-
+ if (g->cur >= g->cnt)
+ res = true;
MT_lock_unset(&g->l);
- return true;
+ return res;
}
#define VLTgenerate(T) { \
@@ -1839,11 +1837,7 @@ generator_next(generator *g, int wid)
assert(g->s.type == GENERATOR_SOURCE);
(void)wid;
-#ifdef HAVE_HGE
- hge cur = 0, i, j;
-#else
- lng cur = 0, i, j;
-#endif
+ BUN cur = 0, i, j = 0;
MT_lock_set(&g->l);
cur = g->cur;
g->cur += g->part_size;
@@ -1877,7 +1871,97 @@ generator_next(generator *g, int wid)
VLTgenerate(dbl);
break;
default:
- assert(0);
+ if (g->type == TYPE_date && g->steptype == TYPE_int) { /*
months */
+ date *v = (date *) Tloc(b, 0);
+ int s = g->step.val.ival;
+ date f = g->first.val.ival;
+ date l = g->limit.val.ival;
+ BUN c = cur;
+ cur += g->part_size;
+ for(BUN i = 0; i< cur; i++)
+ f = date_add_month(f, s);
+ if (cur > g->cnt)
+ cur = g->cnt;
+ if (s < 0) {
+ for (j = 0; c < cur && l < f; c++, j++) {
+ *v++ = f;
+ f = date_add_month(f, s);
+ if (is_date_nil(f)) {
+ BBPreclaim(b);
+ return NULL;
+ }
+ }
+ } else {
+ for (j = 0; c < cur && f < l; c++, j++) {
+ *v++ = f;
+ f = date_add_month(f, s);
+ if (is_date_nil(f)) {
+ BBPreclaim(b);
+ return NULL;
+ }
+ }
+ }
+ b->tsorted = s > 0 || j <= 1;
+ b->trevsorted = s < 0 || j <= 1;
+ } else if (g->type == TYPE_date) { /* days */
+ date *v = (date *) Tloc(b, 0);
+ lng s = g->step.val.lval;
+ date f = g->first.val.ival;
+ date l = g->limit.val.ival;
+ s /= 24*60*60*1000;
+ f += s*cur;
+ BUN c = cur;
+ cur += g->part_size;
+ if (cur > g->cnt)
+ cur = g->cnt;
+ if (s < 0) {
+ for (j = 0; c < cur && l < f; c++, j++) {
+ *v++ = f;
+ f = date_add_day(f, (int) s);
+ if (is_date_nil(f)) {
+ BBPreclaim(b);
+ return NULL;
+ }
+ }
+ } else {
+ for (j = 0; c < cur && f < l; c++, j++) {
+ *v++ = f;
+ f = date_add_day(f, (int) s);
+ if (is_date_nil(f)) {
+ BBPreclaim(b);
+ return NULL;
+ }
+ }
+ }
+ b->tsorted = s > 0 || j <= 1;
+ b->trevsorted = s < 0 || j <= 1;
+ } else if (g->type == TYPE_timestamp) {
+ timestamp *v = (timestamp *) Tloc(b, 0);
+ lng s = g->step.val.lval;
+ timestamp f = g->first.val.lval;
+ timestamp l = g->limit.val.lval;
+ s *= 1000;
+ f += s*cur;
+ BUN c = cur;
+ cur += g->part_size;
+ if (cur > g->cnt)
+ cur = g->cnt;
+ for (j = 0; c < cur; c++, j++) {
+ *v++ = f;
+ f = timestamp_add_usec(f, s);
+ if (is_timestamp_nil(f)) {
+ BBPreclaim(b);
+ return NULL;
+ }
+ }
+ if (cur >= g->cnt && f != l) {
+ *v++ = f;
+ j++;
+ }
+ b->tsorted = s > 0 || j <= 1;
+ b->trevsorted = s < 0 || j <= 1;
+ }
+ break;
}
BATsetcount(b, j);
b->tkey = true;
@@ -1931,14 +2015,45 @@ generator_next(generator *g, int wid)
i++;
\
cnt = i;
\
}
\
+ g->cnt = (BUN)cnt;
\
+ VALset(&g->first, g->type, &f);
\
+ VALset(&g->limit, g->type, &l);
\
+ VALset(&g->step, g->type, &s);
\
+}
+
+#define VLTgetlimits_flt(TPE) {
\
+ BUN cnt = 0;
\
+ TPE f = *getArgReference_##TPE(stk, pci, 1); \
+ TPE l = *getArgReference_##TPE(stk, pci, 2); \
+ TPE s = 0;
\
+ if ( pci->argc == 3)
\
+ s = f <= l ? (TPE) 1 : (TPE) -1;
\
+ else
\
+ s = *getArgReference_##TPE(stk,pci, 3); \
+ if (s == 0 || (s > 0 && f > l) || (s < 0 && f < l) ||
is_##TPE##_nil(f) || is_##TPE##_nil(l) || is_##TPE##_nil(s)) \
+ throw(MAL, "generator.new", SQLSTATE(42000)
"Illegal generator range"); \
+ cnt = (BUN) ((l - f) / s);
\
+ if ((TPE) (cnt * s + f) != l)
\
+ cnt++;
\
g->cnt = cnt;
\
VALset(&g->first, g->type, &f);
\
VALset(&g->limit, g->type, &l);
\
VALset(&g->step, g->type, &s);
\
}
+#define VLTgetlimits_temporal(TPE, tTPE, sTPE) { \
+ TPE f = *getArgReference_TYPE(stk, pci, 1, TPE);\
+ TPE l = *getArgReference_TYPE(stk, pci, 2, TPE);\
+ sTPE s = *getArgReference_##sTPE(stk,pci, 3); \
+ if (s == 0 || is_##tTPE##_nil(f) || is_##tTPE##_nil(l) ||
is_##sTPE##_nil(s)) \
+ throw(MAL, "generator.new", SQLSTATE(42000)
"Illegal generator range"); \
+ VALset(&g->first, g->type, &f);
\
+ VALset(&g->limit, g->type, &l);
\
+ VALset(&g->step, g->steptype, &s);
\
+}
+
static str
-VLTgenerator_get_limits(generator *g, Client cntxt, MalStkPtr stk, InstrPtr
pci)
+VLTgenerator_get_limits(generator *g, Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr pci)
{
(void) cntxt;
@@ -1961,13 +2076,67 @@ VLTgenerator_get_limits(generator *g, Cl
break;
#endif
case TYPE_flt:
- VLTgetlimits(flt, ulng);
+ VLTgetlimits_flt(flt);
break;
case TYPE_dbl:
- VLTgetlimits(dbl, ulng);
+ VLTgetlimits_flt(dbl);
break;
default:
- assert(0);
+ if (g->type == TYPE_date) {
+ /* with date, step is of SQL type "interval month or
day",
+ * i.e., MAL / C type "int" or "lng" */
+ if (pci->argc == 3)
+ throw(MAL,"generator.new", SQLSTATE(42000)
"Date step missing");
+ if (g->steptype == TYPE_int) {
+ ValRecord ret;
+ if (VARcalccmp(&ret, &stk->stk[pci->argv[1]],
&stk->stk[pci->argv[2]]) != GDK_SUCCEED)
+ throw(MAL, "generator.new",
SQLSTATE(42000) "Illegal generator expression range");
+ VLTgetlimits_temporal(date, int, int);
+ int s = g->step.val.ival;
+ if (s == 0 ||
+ (s > 0 && ret.val.btval > 0) ||
+ (s < 0 && ret.val.btval < 0) ||
+ is_date_nil(g->first.val.ival)
|| is_date_nil(g->limit.val.ival))
+ throw(MAL, "generator.new",
SQLSTATE(42000) "Illegal generator range");
+ g->cnt = (BUN) (date_diff(g->limit.val.ival,
g->first.val.ival) / (s *28)) + 1; /* n maybe too large now */
+ } else { /* default interval days */
+ ValRecord ret;
+ if (VARcalccmp(&ret, &stk->stk[pci->argv[1]],
&stk->stk[pci->argv[2]]) != GDK_SUCCEED)
+ throw(MAL, "generator.new",
SQLSTATE(42000) "Illegal generator expression range");
+ VLTgetlimits_temporal(date, int, lng);
+ lng s = g->step.val.lval;
+ if (s == 0 ||
+ (s > 0 && ret.val.btval > 0) ||
+ (s < 0 && ret.val.btval < 0) ||
+ is_date_nil(g->first.val.ival)
|| is_date_nil(g->limit.val.ival))
+ throw(MAL, "generator.new",
SQLSTATE(42000) "Illegal generator range");
+ s /= 24*60*60*1000;
+ /* check if s is really in nr of days or usecs
*/
+ g->cnt = (BUN) (date_diff(g->limit.val.ival,
g->first.val.ival) / s) + 1; /* n maybe too large now */
+ }
+ } else if (g->type == TYPE_timestamp) {
+ if ( pci->argc == 3)
+ throw(MAL,"generator.new",
SQLSTATE(42000) "Timestamp step missing");
+ /* with timestamp, step is of SQL type "interval
seconds",
+ * i.e., MAL / C type "lng" */
+ ValRecord ret = { 0 };
+ if (VARcalccmp(&ret, &stk->stk[pci->argv[1]],
&stk->stk[pci->argv[2]]) != GDK_SUCCEED)
+ throw(MAL, "generator.new", SQLSTATE(42000)
"Illegal generator expression range");
+ VLTgetlimits_temporal(timestamp, lng, lng);
+ lng s = g->step.val.lval;
+ if (s == 0 ||
+ (s > 0 && ret.val.btval > 0) ||
+ (s < 0 && ret.val.btval < 0) ||
+ is_timestamp_nil(g->first.val.lval) ||
is_timestamp_nil(g->limit.val.lval))
+ throw(MAL, "generator.new", SQLSTATE(42000)
"Illegal generator range");
+ /* casting one value to lng causes the whole
+ * computation to be done as lng, reducing the
+ * risk of overflow */
+ s *= 1000; /* msec -> usec */
+ g->cnt = (BUN) (timestamp_diff(g->limit.val.lval,
g->first.val.lval) / s);
+ } else {
+ throw(MAL,"generator.new", SQLSTATE(42000) "unknown
data type %d", getArgType(mb,pci,1));
+ }
}
return MAL_SUCCEED;
}
@@ -1993,6 +2162,8 @@ VLTgenerator_new(Client cntxt, MalBlkPtr
}
b->tsink = (Sink*)g;
g->type = tt;
+ g->steptype = pci->argc==4 ? getArgType(mb, pci, 3) : tt;
+ assert(be->part_size);
g->part_size = be->part_size;
g->cnt = g->cur = 0;
g->s.type = GENERATOR_SOURCE;
@@ -2001,7 +2172,7 @@ VLTgenerator_new(Client cntxt, MalBlkPtr
g->s.next_bat = (sink_next_bat)generator_next;
MT_lock_init(&g->l, "generator");
- msg = VLTgenerator_get_limits(g, cntxt, stk, pci);
+ msg = VLTgenerator_get_limits(g, cntxt, mb, stk, pci);
if( msg == MAL_SUCCEED){
*getArgReference_bat(stk, pci, 0) = b->batCacheid;
diff --git a/sql/backends/monet5/mal_backend.c
b/sql/backends/monet5/mal_backend.c
--- a/sql/backends/monet5/mal_backend.c
+++ b/sql/backends/monet5/mal_backend.c
@@ -10,6 +10,7 @@
#include "monetdb_config.h"
#include "mal_backend.h"
+#include "sql_storage.h"
backend *
backend_reset(backend *b)
@@ -24,6 +25,7 @@ backend_reset(backend *b)
.rowcnt = -1,
.last_id = -1,
.subbackend = b->subbackend,
+ .part_size = DEFAULT_PARTSIZE,
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]