MonetDB: transaction-replication - Handle correctly the default ...
Changeset: 30099e750627 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=30099e750627 Modified Files: gdk/gdk_logger.c Branch: transaction-replication Log Message: Handle correctly the default case - if the logdir path is not absolute diffs (22 lines): diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -1065,9 +1065,15 @@ logger_new(int debug, char *fn, logger_s lg-read32bitoid = 0; #endif - snprintf(filename, BUFSIZ, %s%c%s%c%s%c, -GDKgetenv(gdk_dbpath), DIR_SEP, -log_settings-logdir, DIR_SEP, fn, DIR_SEP); + /* if the logdir path is absolute, do not prefix it with the gdk_dbpath */ + if (MT_path_absolute(log_settings-logdir)) { + snprintf(filename, BUFSIZ, %s%c%s%c%s%c, + log_settings-logdir, DIR_SEP, fn, DIR_SEP); + } else { + snprintf(filename, BUFSIZ, %s%c%s%c%s%c, + GDKgetenv(gdk_dbpath), DIR_SEP, + log_settings-logdir, DIR_SEP, fn, DIR_SEP); + } if ((lg-fn = GDKstrdup(fn)) == NULL || (lg-dir = GDKstrdup(filename)) == NULL) { fprintf(stderr, !ERROR: logger_new: strdup failed\n); ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: transaction-replication - Merge with default branch
Changeset: 7a0efdbd5368 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7a0efdbd5368 Added Files: sql/backends/monet5/generator/Tests/joins00.sql sql/backends/monet5/generator/Tests/joins00.stable.err sql/backends/monet5/generator/Tests/joins00.stable.out sql/test/pg_regress/Tests/abstime.sql sql/test/pg_regress/Tests/aggregates.sql sql/test/pg_regress/Tests/alter_table.sql sql/test/pg_regress/Tests/arrays.sql sql/test/pg_regress/Tests/bit.sql sql/test/pg_regress/Tests/boolean.sql sql/test/pg_regress/Tests/box.sql sql/test/pg_regress/Tests/btree_index.sql sql/test/pg_regress/Tests/case.sql sql/test/pg_regress/Tests/char.sql sql/test/pg_regress/Tests/circle.sql sql/test/pg_regress/Tests/cluster.sql sql/test/pg_regress/Tests/comments.sql sql/test/pg_regress/Tests/conversion.sql sql/test/pg_regress/Tests/copy2.sql sql/test/pg_regress/Tests/create_aggregate.sql sql/test/pg_regress/Tests/create_index.sql sql/test/pg_regress/Tests/create_misc.sql sql/test/pg_regress/Tests/create_operator.sql sql/test/pg_regress/Tests/create_table.sql sql/test/pg_regress/Tests/create_type.sql sql/test/pg_regress/Tests/create_view.sql sql/test/pg_regress/Tests/date.sql sql/test/pg_regress/Tests/domain.sql sql/test/pg_regress/Tests/drop.sql sql/test/pg_regress/Tests/errors.sql sql/test/pg_regress/Tests/float4.sql sql/test/pg_regress/Tests/float8.sql sql/test/pg_regress/Tests/foreign_key.sql sql/test/pg_regress/Tests/geometry.sql sql/test/pg_regress/Tests/hash_index.sql sql/test/pg_regress/Tests/horology.sql sql/test/pg_regress/Tests/inet.sql sql/test/pg_regress/Tests/inherit.sql sql/test/pg_regress/Tests/insert.sql sql/test/pg_regress/Tests/int2.sql sql/test/pg_regress/Tests/int4.sql sql/test/pg_regress/Tests/int8.sql sql/test/pg_regress/Tests/interval.sql sql/test/pg_regress/Tests/join.sql sql/test/pg_regress/Tests/limit.sql sql/test/pg_regress/Tests/lseg.sql sql/test/pg_regress/Tests/mule_internal.sql sql/test/pg_regress/Tests/name.sql sql/test/pg_regress/Tests/namespace.sql sql/test/pg_regress/Tests/numeric.sql sql/test/pg_regress/Tests/numeric_big.sql sql/test/pg_regress/Tests/numerology.sql sql/test/pg_regress/Tests/oid.sql sql/test/pg_regress/Tests/oidjoins.sql sql/test/pg_regress/Tests/opr_sanity.sql sql/test/pg_regress/Tests/path.sql sql/test/pg_regress/Tests/plpgsql.sql sql/test/pg_regress/Tests/point.sql sql/test/pg_regress/Tests/polygon.sql sql/test/pg_regress/Tests/polymorphism.sql sql/test/pg_regress/Tests/portals.sql sql/test/pg_regress/Tests/portals_p2.sql sql/test/pg_regress/Tests/prepare.sql sql/test/pg_regress/Tests/privileges.sql sql/test/pg_regress/Tests/random.sql sql/test/pg_regress/Tests/rangefuncs.sql sql/test/pg_regress/Tests/reltime.sql sql/test/pg_regress/Tests/rowtypes.sql sql/test/pg_regress/Tests/rules.sql sql/test/pg_regress/Tests/sanity_check.sql sql/test/pg_regress/Tests/select.sql sql/test/pg_regress/Tests/select_distinct.sql sql/test/pg_regress/Tests/select_distinct_on.sql sql/test/pg_regress/Tests/select_having.sql sql/test/pg_regress/Tests/select_implicit.sql sql/test/pg_regress/Tests/select_into.sql sql/test/pg_regress/Tests/select_views.sql sql/test/pg_regress/Tests/sequence.sql sql/test/pg_regress/Tests/sql_ascii.sql sql/test/pg_regress/Tests/stats.sql sql/test/pg_regress/Tests/strings.sql sql/test/pg_regress/Tests/strings_cast.sql sql/test/pg_regress/Tests/strings_concat.sql sql/test/pg_regress/Tests/strings_like.sql sql/test/pg_regress/Tests/subselect.sql sql/test/pg_regress/Tests/temp.sql sql/test/pg_regress/Tests/text.sql sql/test/pg_regress/Tests/time.sql sql/test/pg_regress/Tests/timestamp.sql sql/test/pg_regress/Tests/timestamptz.sql sql/test/pg_regress/Tests/timetz.sql sql/test/pg_regress/Tests/tinterval.sql sql/test/pg_regress/Tests/transactions.sql sql/test/pg_regress/Tests/triggers.sql sql/test/pg_regress/Tests/truncate.sql sql/test/pg_regress/Tests/type_sanity.sql sql/test/pg_regress/Tests/union.sql sql/test/pg_regress/Tests/update.sql sql/test/pg_regress/Tests/vacuum.sql sql/test/pg_regress/Tests/varchar.sql sql/test/pg_regress/Tests/without_oid.sql Removed Files: sql/test/pg_regress/monetdb/abstime.sql sql/test/pg_regress/monetdb/aggregates.sql
MonetDB: Jan2014 - Add author back.
Changeset: fcf0be25fcd9 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fcf0be25fcd9 Modified Files: java/src/nl/cwi/monetdb/jdbc/MonetResultSet.java Branch: Jan2014 Log Message: Add author back. diffs (11 lines): diff --git a/java/src/nl/cwi/monetdb/jdbc/MonetResultSet.java b/java/src/nl/cwi/monetdb/jdbc/MonetResultSet.java --- a/java/src/nl/cwi/monetdb/jdbc/MonetResultSet.java +++ b/java/src/nl/cwi/monetdb/jdbc/MonetResultSet.java @@ -47,6 +47,7 @@ import nl.cwi.monetdb.mcl.parser.*; * for FORWARD_ONLY result sets the memory usage will be likely lower for large * result sets. * + * @author Fabian Groffen fabian.grof...@cwi.nl * @version 0.7 */ public class MonetResultSet extends MonetWrapper implements ResultSet { ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: RIntegration - add a ptr to the sql_func as first argum...
Changeset: acfebc9f7805 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=acfebc9f7805 Modified Files: sql/backends/monet5/sql_gencode.c sql/include/sql_catalog.h Branch: RIntegration Log Message: add a ptr to the sql_func as first argument, when calling any of the FUNC_LANG_R,C,J extentions. diffs (91 lines): diff --git a/sql/backends/monet5/sql_gencode.c b/sql/backends/monet5/sql_gencode.c --- a/sql/backends/monet5/sql_gencode.c +++ b/sql/backends/monet5/sql_gencode.c @@ -90,6 +90,21 @@ constantAtom(backend *sql, MalBlkPtr mb, return idx; } +static InstrPtr +pushPtr(MalBlkPtr mb, InstrPtr q, ptr val) +{ + int _t; + ValRecord cst; + + if (q == NULL) + return NULL; + cst.vtype= TYPE_ptr; + cst.val.pval = val; + cst.len = 0; + _t = defConstant(mb, TYPE_ptr, cst); + return pushArgument(mb, q, _t); +} + static int argumentZero(MalBlkPtr mb, int tpe) { @@ -684,6 +699,8 @@ dump_joinN(backend *sql, MalBlkPtr mb, s /* filter qualifying tuples, return oids of h and tail */ q = newStmt(mb, mod, fimp); q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any)); + if (LANG_EXT(f-lang)) + q = pushPtr(mb, q, f); if (f-lang == FUNC_LANG_R) q = pushStr(mb, q, f-query); q = pushArgument(mb, q, op1); @@ -1217,6 +1234,8 @@ static int fimp = sql_func_imp(s-op4.funcval-func); q = newStmt(mb, mod, convertOperator(fimp)); + if (LANG_EXT(f-lang)) + q = pushPtr(mb, q, f); if (f-lang == FUNC_LANG_R) q = pushStr(mb, q, f-query); q = pushArgument(mb, q, l); @@ -1838,6 +1857,8 @@ static int } else { q = newStmt(mb, mod, fimp); setVarType(mb, getArg(q, 0), rtype); + if (LANG_EXT(f-lang)) + q = pushPtr(mb, q, f); if (f-lang == FUNC_LANG_R) q = pushStr(mb, q, f-query); q = pushArgument(mb, q, l); @@ -1891,6 +1912,8 @@ static int s-nr = getDestVar(q); } else { q = newStmt(mb, mod, convertOperator(fimp)); + if (LANG_EXT(f-lang)) + q = pushPtr(mb, q, f); if (f-lang == FUNC_LANG_R) q = pushStr(mb, q, f-query); setVarType(mb, getArg(q, 0), rtype); @@ -1955,6 +1978,8 @@ static int if (strcmp(fimp, round) == 0 tpe tpe-type-eclass == EC_DEC) special = 1; + if (LANG_EXT(f-func-lang)) + q = pushPtr(mb, q, f-func); if (f-func-lang == FUNC_LANG_R) q = pushStr(mb, q, f-func-query); for (n = s-op1-op4.lval-h; n; n = n-next) { @@ -2064,6 +2089,8 @@ static int setVarUDFtype(mb, getArg(q, 0)); } } + if (LANG_EXT(a-aggr-lang)) + q = pushPtr(mb, q, a-aggr); if (a-aggr-lang == FUNC_LANG_R){ if (!g) { setVarType(mb, getArg(q, 0), restype); diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h --- a/sql/include/sql_catalog.h +++ b/sql/include/sql_catalog.h @@ -290,6 +290,8 @@ typedef struct sql_arg { #define FUNC_LANG_C 4 #define FUNC_LANG_J 5 +#define LANG_EXT(l) (lFUNC_LANG_SQL) + typedef struct sql_func { sql_base base; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - add json aggregate for double columns
Changeset: facde0cda494 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=facde0cda494 Added Files: sql/test/json/Tests/aggregate01.sql sql/test/json/Tests/aggregate01.stable.err sql/test/json/Tests/aggregate01.stable.out Modified Files: monetdb5/modules/atoms/json.c monetdb5/modules/atoms/json.mal sql/scripts/40_json.sql sql/test/json/Tests/All sql/test/json/Tests/aggregate00.sql Branch: default Log Message: add json aggregate for double columns diffs (truncated from 401 to 300 lines): diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c --- a/monetdb5/modules/atoms/json.c +++ b/monetdb5/modules/atoms/json.c @@ -1603,11 +1603,13 @@ JSONgroupStr(str *ret, const bat *bid) { BAT *b; BUN p, q; - const char *t; + const char *t = NULL; size_t len, size = BUFSIZ, offset; str buf = GDKmalloc(size); BATiter bi; const char *err = NULL; + char temp[128] = ; + const double * val = NULL; if (buf == NULL) throw(MAL, json.group,MAL_MALLOC_FAIL); @@ -1620,9 +1622,20 @@ JSONgroupStr(str *ret, const bat *bid) offset = 0; bi = bat_iterator(b); BATloop(b, p, q) { - int n; + int n = 0; - t = (const char *) BUNtail(bi, p); + switch (b-ttype) { + case TYPE_str: + t = (const char *) BUNtail(bi, p); + break; + case TYPE_dbl: + val = (const double *) BUNtail(bi, p); + snprintf(temp, sizeof(temp), %f, *val); + t = (const char *)temp; + break; + } + + //t = (const char *) BUNtail(bi, p); if (strNil(t)) continue; @@ -1635,18 +1648,37 @@ JSONgroupStr(str *ret, const bat *bid) goto failed; } } - if (offset == 0) { - if (BATcount(b) == 1) { - n = snprintf(buf, size, [ \%s\ ], t); + switch (b-ttype) { + case TYPE_str: + if (offset == 0) { + if (BATcount(b) == 1) { + n = snprintf(buf, size, [ \%s\ ], t); + } else { + n = snprintf(buf, size, [ \%s\, t); + } } else { - n = snprintf(buf, size, [ \%s\, t); + if (p == BUNlast(b) - 1) { + n = snprintf(buf + offset, size - offset, , \%s\ ], t); + } else { + n = snprintf(buf + offset, size - offset, , \%s\, t); + } } - } else { - if (p == BUNlast(b) - 1) { - n = snprintf(buf + offset, size - offset, , \%s\ ], t); - } else { - n = snprintf(buf + offset, size - offset, , \%s\, t); + break; + case TYPE_dbl: + if (offset == 0) { + if (BATcount(b) == 1) { + n = snprintf(buf, size, [ %s ], t); + } else { + n = snprintf(buf, size, [ %s, t); + } + } else { + if (p == BUNlast(b) - 1) { + n = snprintf(buf + offset, size - offset, , %s ], t); + } else { + n = snprintf(buf + offset, size - offset, , %s, t); + } } + break; } offset += n; } @@ -1670,7 +1702,7 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g, BUN nils = 0; int isnil; const oid *cand = NULL, *candend = NULL; - const char *v; + const char *v = NULL; const oid *grps, *map; oid mapoff = 0; oid prev; @@ -1679,12 +1711,14 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g, char *buf = NULL; size_t buflen, maxlen, len; const char *err; + char temp[128] = ; + const double * val = NULL; if ((err = BATgroupaggrinit(b, g, e, s, min, max, ngrp, start, end, cnt, cand, candend)) != NULL) { return err; } - assert(b-ttype == TYPE_str); + assert(b-ttype == TYPE_str||b-ttype == TYPE_dbl);
MonetDB: default - add null handling for double columns and add ...
Changeset: c70d5a791521 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c70d5a791521 Modified Files: monetdb5/modules/atoms/json.c sql/test/json/Tests/aggregate00.sql sql/test/json/Tests/aggregate00.stable.out sql/test/json/Tests/aggregate01.sql sql/test/json/Tests/aggregate01.stable.out Branch: default Log Message: add null handling for double columns and add tests diffs (217 lines): diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c --- a/monetdb5/modules/atoms/json.c +++ b/monetdb5/modules/atoms/json.c @@ -1825,12 +1825,16 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g, v = (const char *) BUNtail(bi, BUNfirst(b) + (map ? (BUN) map[p] : p + mapoff)); break; case TYPE_dbl: - val = (const double *) BUNtail(bi, BUNfirst(b) + (map ? (BUN) map[p] : p + mapoff)); - snprintf(temp, sizeof(temp), %f, *val); - v = (const char *)temp; + val = (const double *) BUNtail(bi, BUNfirst(b) + (map ? (BUN) map[p] : p + mapoff)); + if (*val != dbl_nil) { + snprintf(temp, sizeof(temp), %f, *val); + v = (const char *)temp; + } else { + v = NULL; + } break; } - if (strNil(v)) { + if (!v||strNil(v)) { if (skip_nils) continue; strncpy(buf, str_nil, buflen); diff --git a/sql/test/json/Tests/aggregate00.sql b/sql/test/json/Tests/aggregate00.sql --- a/sql/test/json/Tests/aggregate00.sql +++ b/sql/test/json/Tests/aggregate00.sql @@ -1,21 +1,37 @@ -create table aggrtest ( col1 varchar(10), col2 integer ); +create table aggrtest00 ( col1 varchar(10), col2 integer ); -select json.tojsonarray(col1) from aggrtest; +select json.tojsonarray(col1) from aggrtest00; -insert into aggrtest values ('hallo', 1); +insert into aggrtest00 values ('hallo', 1); -select json.tojsonarray(col1) from aggrtest; +select json.tojsonarray(col1) from aggrtest00; -insert into aggrtest values ('world', 1); +insert into aggrtest00 values ('world', 1); -select json.tojsonarray(col1) from aggrtest; +select json.tojsonarray(col1) from aggrtest00; -select json.tojsonarray(col1) from aggrtest group by col2; +select json.tojsonarray(col1) from aggrtest00 group by col2; -insert into aggrtest values ('foobar', 2); +insert into aggrtest00 values ('foobar', 2); -select json.tojsonarray(col1) from aggrtest; +select json.tojsonarray(col1) from aggrtest00; -select json.tojsonarray(col1) from aggrtest group by col2; +select json.tojsonarray(col1) from aggrtest00 group by col2; -drop table aggrtest; +delete from aggrtest00; + +insert into aggrtest00 values (NULL, 1); + +select json.tojsonarray(col1) from aggrtest00; + +insert into aggrtest00 values ('hello', 1); + +select json.tojsonarray(col1) from aggrtest00; + +insert into aggrtest00 values ('world', 2); + +select json.tojsonarray(col1) from aggrtest00; + +select json.tojsonarray(col1) from aggrtest00 group by col2; + +drop table aggrtest00; diff --git a/sql/test/json/Tests/aggregate00.stable.out b/sql/test/json/Tests/aggregate00.stable.out --- a/sql/test/json/Tests/aggregate00.stable.out +++ b/sql/test/json/Tests/aggregate00.stable.out @@ -94,6 +94,40 @@ Ready. % 20 # length [ [ \hallo\, \world\ ] ] [ [ \foobar\ ] ] +#delete from aggrtest00; +[ 3] +#insert into aggrtest00 values (NULL, 1); +[ 1] +#select json.tojsonarray(col1) from aggrtest00; +% sys.L1 # table_name +% L1 # name +% clob # type +% 0 # length +[ NULL ] +#insert into aggrtest00 values ('hello', 1); +[ 1] +#select json.tojsonarray(col1) from aggrtest00; +% sys.L1 # table_name +% L1 # name +% clob # type +% 11 # length +[ [ \hello\ ] ] +#insert into aggrtest00 values ('world', 2); +[ 1] +#select json.tojsonarray(col1) from aggrtest00; +% sys.L1 # table_name +% L1 # name +% clob # type +% 20 # length +[ [ \hello\, \world\ ] ] +#select json.tojsonarray(col1) from aggrtest00 group by col2; +% sys.L1 # table_name +% L1 # name +% clob # type +% 11 # length +[ [ \hello\ ] ] +[ [ \world\ ] ] +#drop table aggrtest00; # 15:08:41 # 15:08:41 Done. diff --git a/sql/test/json/Tests/aggregate01.sql b/sql/test/json/Tests/aggregate01.sql --- a/sql/test/json/Tests/aggregate01.sql +++ b/sql/test/json/Tests/aggregate01.sql @@ -1,21 +1,37 @@ -create table aggrtest1 ( col1 double, col2 integer ); +create table aggrtest01 ( col1 double, col2 integer ); -select json.tojsonarray(col1) from aggrtest1; +select
MonetDB: transaction-replication - Use the shortcut notation for...
Changeset: 6f75ca6649d3 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6f75ca6649d3 Modified Files: gdk/gdk_logger.c Branch: transaction-replication Log Message: Use the shortcut notation for the char array diffs (12 lines): diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -1205,7 +1205,7 @@ logger_new(int debug, char *fn, logger_s if (bid) { /* upgrade from old logger format */ - logger_upgrade_format(fn, lg, bid, bak[0]); + logger_upgrade_format(fn, lg, bid, bak); } snprintf(bak, BUFSIZ, %s_catalog_bid, fn); ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: transaction-replication - Fix logger directory name str...
Changeset: d420fe5453d3 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d420fe5453d3 Modified Files: gdk/gdk_logger.c Branch: transaction-replication Log Message: Fix logger directory name string format diffs (12 lines): diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -1160,7 +1160,7 @@ logger_new(int debug, char *fn, logger_s /* if the logdir path is absolute, do not prefix it with the gdk_dbpath */ if (MT_path_absolute(log_settings-logdir)) { - snprintf(filename, BUFSIZ, %s%c%s%c%s%c, + snprintf(filename, BUFSIZ, %s%c%s%c, log_settings-logdir, DIR_SEP, fn, DIR_SEP); } else { snprintf(filename, BUFSIZ, %s%c%s%c%s%c, ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: RIntegration - R function is now called with variable n...
Changeset: 47799986a2a9 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=47799986a2a9 Modified Files: monetdb5/extras/rapi/Makefile.ag monetdb5/extras/rapi/rapi.c monetdb5/extras/rapi/rapi.mal sql/backends/monet5/Tests/All sql/backends/monet5/Tests/rapi01.sql sql/backends/monet5/Tests/rapi02.sql sql/backends/monet5/Tests/rapi02.stable.out sql/backends/monet5/Tests/rapi03.sql sql/backends/monet5/Tests/rapi04.sql sql/backends/monet5/Tests/rapi05.sql sql/backends/monet5/Tests/rapi06.sql sql/backends/monet5/Tests/rapi06.stable.out sql/backends/monet5/mal_backend.c sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_scenario.c sql/common/sql_keyword.c sql/common/sql_list.c sql/common/sql_mem.c sql/include/sql_mem.h sql/server/sql_qc.c sql/storage/restrict/restrict_table.c sql/storage/store.c sql/storage/store_dependency.c sql/storage/store_sequence.c Branch: RIntegration Log Message: R function is now called with variable names that correspond the SQL function parameters. diffs (truncated from 604 to 300 lines): diff --git a/monetdb5/extras/rapi/Makefile.ag b/monetdb5/extras/rapi/Makefile.ag --- a/monetdb5/extras/rapi/Makefile.ag +++ b/monetdb5/extras/rapi/Makefile.ag @@ -20,6 +20,7 @@ INCLUDES = \ ../../../common/stream \ ../../../gdk \ ../../mal \ + ../../../sql/include \ $(libr_CFLAGS) MTSAFE diff --git a/monetdb5/extras/rapi/rapi.c b/monetdb5/extras/rapi/rapi.c --- a/monetdb5/extras/rapi/rapi.c +++ b/monetdb5/extras/rapi/rapi.c @@ -26,6 +26,7 @@ #include mal_stack.h #include mal_linker.h #include gdk_utils.h +#include sql_catalog.h #include rapi.h @@ -43,6 +44,8 @@ #include string.h #include sys/stat.h +//#define _RAPI_DEBUG_ + #define BAT_TO_INTSXP(bat,tpe,retsxp) { \ tpe v; size_t j; \ retsxp = PROTECT(NEW_INTEGER(BATcount(bat))); \ @@ -148,10 +151,6 @@ void writeConsole(const char * buf, int static int RAPIinitialize(void) { -#ifdef _RAPI_DEBUG_ - printf(# R libraries installed in %s\n,rlibs); -#endif - #ifdef RIF_HAS_RSIGHAND R_SignalHandlers=0; #endif @@ -212,6 +211,9 @@ static int RAPIinitialize(void) { return 4; } } +#ifdef _RAPI_DEBUG_ + printf(# R libraries installed in %s\n,rlibs); +#endif PROTECT(librisexp = allocVector(STRSXP, 1)); SET_STRING_ELT(librisexp, 0, mkChar(rlibs)); @@ -236,13 +238,15 @@ static int RAPIinitialize(void) { } str RAPIeval(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - str exprStr = *(str*) getArgReference(stk, pci, pci-retc); + sql_func * sqlfun =* (sql_func**) getArgReference(stk, pci, pci-retc); + str exprStr = *(str*) getArgReference(stk, pci, pci-retc+1); + SEXP x, env, retval; SEXP varname = R_NilValue; SEXP varvalue = R_NilValue; ParseStatus status; - int i, j, k = 1; - char buf[64] = rapi; + int i, j = 1; + char argbuf[64]; char argnames[1000] = ; char* rcall; size_t ret_rows = 0; @@ -253,6 +257,8 @@ str RAPIeval(Client cntxt, MalBlkPtr mb, BAT *b; BUN cnt; int initstatus = 0; + node * argnode; + int seengrp = FALSE; // we don't need no context, but the compiler needs us to touch it (...) (void) cntxt; @@ -286,9 +292,36 @@ str RAPIeval(Client cntxt, MalBlkPtr mb, env = PROTECT(eval(lang1(install(new.env)),R_GlobalEnv)); assert(env != NULL); + // first argument after the return contains the pointer to the sql_func structure + // NEW macro temporarily renamed to MNEW to allow including sql_catalog.h + + if (!list_empty(sqlfun-ops)) { + int carg = pci-retc + 2; + argnode= sqlfun-ops-h; + while (argnode ) { + char* argname = ((sql_arg*)argnode-data)-name; + args[carg] = GDKstrdup(argname); + carg++; + argnode = argnode-next; + } + } + // the first unknown argument is the group, we don't really care for the rest. + for (i = pci-retc + 2; i pci-argc; i++) { + if (args[i] == NULL) { + if (!seengrp) { + args[i] = GDKstrdup(aggr_group); + seengrp = TRUE; + } + else { + sprintf(argbuf,arg%i,i); + args[i] = GDKstrdup(argbuf); + } + } + } + // install the MAL variables into the R environment // we can basically map values to int (INTEGER)
MonetDB: transaction-replication - Pull out logger catalog file ...
Changeset: 0d456089835a for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0d456089835a Modified Files: gdk/gdk_logger.c Branch: transaction-replication Log Message: Pull out logger catalog file creation in a separate function diffs (122 lines): diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -1131,6 +1131,60 @@ logger_upgrade_format(char *fn, logger * lg-seqs_val = NULL; } + +static int +logger_create_catalog_file(int debug, logger *lg, char *fn, FILE *fp, char *filename, char *bak) { + log_bid bid = 0; + /* catalog does not exist, so the log file also +* shouldn't exist */ + if (fp != NULL) { + logger_fatal( + logger_new: there is no logger catalog, but there is a log file.\n + Are you sure you are using the correct combination of database\n + (--dbpath) and log directory (--set %s_logdir)?\n, fn, + 0, 0); + return 0; + } + lg-catalog_bid = logbat_new(TYPE_int, BATSIZE); + lg-catalog_nme = logbat_new(TYPE_str, BATSIZE); + if (debug 1) + fprintf(stderr, #create %s catalog\n, fn); + + /* Make persistent */ + bid = lg-catalog_bid-batCacheid; + BBPincref(bid, TRUE); + BATmode(lg-catalog_bid, PERSISTENT); + snprintf(bak, BUFSIZ, %s_catalog_bid, fn); + BBPrename(lg-catalog_bid-batCacheid, bak); + /* Make persistent */ + bid = lg-catalog_nme-batCacheid; + BBPincref(bid, TRUE); + BATmode(lg-catalog_nme, PERSISTENT); + snprintf(bak, BUFSIZ, %s_catalog_nme, fn); + BBPrename(lg-catalog_nme-batCacheid, bak); + if (!GDKcreatedir(filename)) { + logger_fatal(logger_new: cannot create directory for log file %s\n, + filename, 0, 0); + return 0; + } + if ((fp = fopen(filename, w)) == NULL) { + logger_fatal(logger_new: cannot create log file %s\n, filename, 0, 0); + return 0; + } + fprintf(fp, %06d\n\n, lg-version); + lg-id++; + fprintf(fp, LLFMT \n, lg-id); + fclose(fp); + fp = NULL; + if (bm_subcommit(lg-catalog_bid, lg-catalog_nme, lg-catalog_bid, + lg-catalog_nme, NULL, lg-debug) != 0) { + /* cannot commit catalog, so remove log */ + unlink(filename); + return 0; + } + return 1; +} + static logger * logger_new(int debug, char *fn, logger_settings *log_settings, int version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp) { @@ -1212,56 +1266,7 @@ logger_new(int debug, char *fn, logger_s catalog_bid = BBPindex(bak); if (catalog_bid == 0) { - log_bid bid = 0; - - /* catalog does not exist, so the log file also -* shouldn't exist */ - if (fp != NULL) { - logger_fatal(logger_new: there is no logger catalog, but there is a log file.\n -Are you sure you are using the correct combination of database\n -(--dbpath) and log directory (--set %s_logdir)?\n, -fn, 0, 0); - goto error; - } - - lg-catalog_bid = logbat_new(TYPE_int, BATSIZE); - lg-catalog_nme = logbat_new(TYPE_str, BATSIZE); - if (debug 1) - fprintf(stderr, #create %s catalog\n, fn); - - /* Make persistent */ - bid = lg-catalog_bid-batCacheid; - BBPincref(bid, TRUE); - BATmode(lg-catalog_bid, PERSISTENT); - snprintf(bak, BUFSIZ, %s_catalog_bid, fn); - BBPrename(lg-catalog_bid-batCacheid, bak); - - /* Make persistent */ - bid = lg-catalog_nme-batCacheid; - BBPincref(bid, TRUE); - BATmode(lg-catalog_nme, PERSISTENT); - snprintf(bak, BUFSIZ, %s_catalog_nme, fn); - BBPrename(lg-catalog_nme-batCacheid, bak); - - if (!GDKcreatedir(filename)) { - logger_fatal(logger_new: cannot create directory for log file %s\n, -filename, 0, 0); - goto error; - } - if ((fp = fopen(filename, w)) == NULL) { - logger_fatal(logger_new: cannot create log file %s\n, -filename, 0, 0); - goto error; - } - fprintf(fp, %06d\n\n, lg-version); - lg-id ++; - fprintf(fp, LLFMT \n, lg-id); - fclose(fp); - fp =
MonetDB: transaction-replication - Pull out finding the correct ...
Changeset: 1ccce1c0ec18 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1ccce1c0ec18 Modified Files: gdk/gdk_logger.c Branch: transaction-replication Log Message: Pull out finding the correct log BAT for the sequence ID to a separate function diffs (84 lines): diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -1222,6 +1222,39 @@ logger_find_persistent_catalog(logger *l return 1; } +static void +logger_find_logbat(logger* lg, int id, log_bid seqs_id) { + bat seqs_val = logger_find_bat(lg, seqs_val); + bat snapshots_bid = logger_find_bat(lg, snapshots_bid); + bat snapshots_tid = logger_find_bat(lg, snapshots_tid); + lg-seqs_id = BATdescriptor(seqs_id); + if (lg-seqs_id == 0) { + logger_fatal(Logger_new: inconsistent database, seqs_id does not exist, 0, 0, 0); + } + + lg-seqs_val = BATdescriptor(seqs_val); + if (lg-seqs_val == 0) { + logger_fatal(Logger_new: inconsistent database, seqs_val does not exist, 0, 0, 0); + } + + if (BATcount(lg-seqs_id)) { + BUN p = BUNfndT(lg-seqs_id, id); + lg-id = *(lng *) Tloc(lg-seqs_val, p); + } else { + BUNappend(lg-seqs_id, id, FALSE); + BUNappend(lg-seqs_val, lg-id, FALSE); + } + lg-snapshots_bid = BATdescriptor(snapshots_bid); + if (lg-snapshots_bid == 0) { + logger_fatal(Logger_new: inconsistent database, snapshots_bid does not exist, 0, 0, 0); + } + + lg-snapshots_tid = BATdescriptor(snapshots_tid); + if (lg-snapshots_tid == 0) { + logger_fatal(Logger_new: inconsistent database, snapshots_tid does not exist, 0, 0, 0); + } +} + static logger * logger_new(int debug, char *fn, logger_settings *log_settings, int version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp) { @@ -1312,6 +1345,7 @@ logger_new(int debug, char *fn, logger_s goto error; } } + seqs_id = logger_find_bat(lg, seqs_id); if (seqs_id == 0) { lg-seqs_id = logbat_new(TYPE_int, 1); @@ -1343,30 +1377,9 @@ logger_new(int debug, char *fn, logger_s bm_subcommit(lg-catalog_bid, lg-catalog_nme, lg-catalog_bid, lg-catalog_nme, NULL, lg-debug); } else { - bat seqs_val = logger_find_bat(lg, seqs_val); - bat snapshots_bid = logger_find_bat(lg, snapshots_bid); - bat snapshots_tid = logger_find_bat(lg, snapshots_tid); + logger_find_logbat(lg, id, seqs_id); + } - lg-seqs_id = BATdescriptor(seqs_id); - if (lg-seqs_id == 0) - logger_fatal(Logger_new: inconsistent database, seqs_id does not exist,0,0,0); - lg-seqs_val = BATdescriptor(seqs_val); - if (lg-seqs_val == 0) - logger_fatal(Logger_new: inconsistent database, seqs_val does not exist,0,0,0); - if (BATcount(lg-seqs_id)) { - BUN p = BUNfndT(lg-seqs_id, id); - lg-id = *(lng *) Tloc(lg-seqs_val, p); - } else { - BUNappend(lg-seqs_id, id, FALSE); - BUNappend(lg-seqs_val, lg-id, FALSE); - } - lg-snapshots_bid = BATdescriptor(snapshots_bid); - if (lg-snapshots_bid == 0) - logger_fatal(Logger_new: inconsistent database, snapshots_bid does not exist,0,0,0); - lg-snapshots_tid = BATdescriptor(snapshots_tid); - if (lg-snapshots_tid == 0) - logger_fatal(Logger_new: inconsistent database, snapshots_tid does not exist,0,0,0); - } lg-freed = BATnew(TYPE_void, TYPE_int, 1); BATseqbase(lg-freed, 0); snprintf(bak, BUFSIZ, %s_freed, fn); ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Jan2014 - Accept _ in function name.
Changeset: 4108b9677d4c for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4108b9677d4c Modified Files: clients/odbc/driver/ODBCUtil.c Branch: Jan2014 Log Message: Accept _ in function name. diffs (21 lines): diff --git a/clients/odbc/driver/ODBCUtil.c b/clients/odbc/driver/ODBCUtil.c --- a/clients/odbc/driver/ODBCUtil.c +++ b/clients/odbc/driver/ODBCUtil.c @@ -565,7 +565,7 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL while (*p == ' ') p++; proc = p; - while (*p isascii(*p) isalnum(*p)) + while (*p isascii(*p) (*p == '_' || isalnum(*p))) p++; if (p == proc || (isascii(*proc) !isalpha(*proc))) @@ -619,7 +619,7 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL while (*p == ' ') p++; scalarfunc = p; - while (*p isascii(*p) isalnum(*p)) + while (*p isascii(*p) (*p == '_' || isalnum(*p))) p++; if (p == scalarfunc || (isascii(*scalarfunc) !isalpha(*scalarfunc))) ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Jan2014 - Mention timestampadd function.
Changeset: 79541584843c for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=79541584843c Modified Files: clients/odbc/driver/ODBCUtil.c Branch: Jan2014 Log Message: Mention timestampadd function. diffs (11 lines): diff --git a/clients/odbc/driver/ODBCUtil.c b/clients/odbc/driver/ODBCUtil.c --- a/clients/odbc/driver/ODBCUtil.c +++ b/clients/odbc/driver/ODBCUtil.c @@ -356,6 +356,7 @@ static struct scalars { {now, 0, \now\(), }, {quarter, 1, ((\month\(\1) - 1) / 3 + 1), }, {second, 1, \second\(\1), }, + {timestampadd, 3, NULL, }, {timestampdiff, 3, NULL, }, {week, 1, \week\(\1), }, {year, 1, \year\(\1), }, ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Jan2014 - Fix up information about available functions ...
Changeset: a969b886cc71 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a969b886cc71 Modified Files: clients/odbc/driver/SQLGetInfo.c Branch: Jan2014 Log Message: Fix up information about available functions in SQLGetInfo. diffs (236 lines): diff --git a/clients/odbc/driver/SQLGetInfo.c b/clients/odbc/driver/SQLGetInfo.c --- a/clients/odbc/driver/SQLGetInfo.c +++ b/clients/odbc/driver/SQLGetInfo.c @@ -183,27 +183,53 @@ SQLGetInfo_(ODBCDbc *dbc, /* SQL_CB_NON_NULL */ len = sizeof(SQLUSMALLINT); break; + case SQL_CONVERT_TINYINT: + case SQL_CONVERT_SMALLINT: + case SQL_CONVERT_INTEGER: case SQL_CONVERT_BIGINT: + nValue = SQL_CVT_BIGINT | + SQL_CVT_BIT | + SQL_CVT_CHAR | + SQL_CVT_DECIMAL | + SQL_CVT_DOUBLE | + SQL_CVT_FLOAT | + SQL_CVT_INTEGER | + SQL_CVT_INTERVAL_DAY_TIME | + SQL_CVT_INTERVAL_YEAR_MONTH | + SQL_CVT_LONGVARCHAR | + SQL_CVT_NUMERIC | + SQL_CVT_REAL | + SQL_CVT_SMALLINT | + SQL_CVT_TINYINT | + SQL_CVT_VARCHAR; + len = sizeof(SQLUINTEGER); + break; case SQL_CONVERT_BINARY: + case SQL_CONVERT_LONGVARBINARY: + case SQL_CONVERT_VARBINARY: + nValue = SQL_CVT_BINARY | + SQL_CVT_CHAR | + SQL_CVT_LONGVARBINARY | + SQL_CVT_LONGVARCHAR | + SQL_CVT_VARBINARY | + SQL_CVT_VARCHAR; + /* SQL_CVT_GUID */ + len = sizeof(SQLUINTEGER); + break; case SQL_CONVERT_BIT: + nValue = SQL_CVT_BIGINT | + SQL_CVT_BIT | + SQL_CVT_CHAR | + SQL_CVT_INTEGER | + SQL_CVT_LONGVARCHAR | + SQL_CVT_SMALLINT | + SQL_CVT_TINYINT | + SQL_CVT_VARCHAR; + len = sizeof(SQLUINTEGER); + break; case SQL_CONVERT_CHAR: - case SQL_CONVERT_DATE: - case SQL_CONVERT_DECIMAL: - case SQL_CONVERT_DOUBLE: - case SQL_CONVERT_FLOAT: - case SQL_CONVERT_INTEGER: - case SQL_CONVERT_INTERVAL_DAY_TIME: - case SQL_CONVERT_INTERVAL_YEAR_MONTH: - case SQL_CONVERT_LONGVARBINARY: + case SQL_CONVERT_VARCHAR: case SQL_CONVERT_LONGVARCHAR: - case SQL_CONVERT_NUMERIC: - case SQL_CONVERT_REAL: - case SQL_CONVERT_SMALLINT: - case SQL_CONVERT_TIME: - case SQL_CONVERT_TIMESTAMP: - case SQL_CONVERT_TINYINT: - case SQL_CONVERT_VARBINARY: - case SQL_CONVERT_VARCHAR: nValue = SQL_CVT_BIGINT | SQL_CVT_BINARY | SQL_CVT_BIT | @@ -228,8 +254,91 @@ SQLGetInfo_(ODBCDbc *dbc, /* SQL_CVT_GUID */ len = sizeof(SQLUINTEGER); break; + case SQL_CONVERT_DATE: + nValue = SQL_CVT_CHAR | + SQL_CVT_DATE | + SQL_CVT_LONGVARCHAR | + SQL_CVT_TIMESTAMP | + SQL_CVT_VARCHAR; + len = sizeof(SQLUINTEGER); + break; + case SQL_CONVERT_DECIMAL: + case SQL_CONVERT_NUMERIC: + nValue = SQL_CVT_BIGINT | + SQL_CVT_CHAR | + SQL_CVT_DECIMAL | + SQL_CVT_DOUBLE | + SQL_CVT_FLOAT | + SQL_CVT_INTEGER | + SQL_CVT_INTERVAL_DAY_TIME | + SQL_CVT_LONGVARCHAR | + SQL_CVT_NUMERIC | + SQL_CVT_REAL | + SQL_CVT_SMALLINT | + SQL_CVT_TINYINT | + SQL_CVT_VARCHAR; + len = sizeof(SQLUINTEGER); + break; + case SQL_CONVERT_DOUBLE: + case SQL_CONVERT_REAL: + case SQL_CONVERT_FLOAT: + nValue = SQL_CVT_BIGINT | + SQL_CVT_CHAR | + SQL_CVT_DECIMAL | + SQL_CVT_DOUBLE | + SQL_CVT_FLOAT | + SQL_CVT_INTEGER | + SQL_CVT_LONGVARCHAR | + SQL_CVT_NUMERIC | + SQL_CVT_REAL | + SQL_CVT_SMALLINT | + SQL_CVT_TINYINT | + SQL_CVT_VARCHAR; + /* SQL_CVT_GUID */ + len = sizeof(SQLUINTEGER); + break; + case
MonetDB: default - Silence compilers
Changeset: da1dfeb8b6f4 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=da1dfeb8b6f4 Modified Files: sql/backends/monet5/generator/Tests/generator03.stable.out sql/backends/monet5/generator/generator.c Branch: default Log Message: Silence compilers diffs (173 lines): diff --git a/sql/backends/monet5/generator/Tests/generator03.stable.out b/sql/backends/monet5/generator/Tests/generator03.stable.out --- a/sql/backends/monet5/generator/Tests/generator03.stable.out +++ b/sql/backends/monet5/generator/Tests/generator03.stable.out @@ -35,9 +35,10 @@ Ready. % single_value # name % sec_interval # type % 0 # length -[ 10.000 ] -#select * from generate_series(cast( '2008-03-01 00:00' as timestamp), -# cast( '2008-03-04 12:00' as timestamp), +[ 36000.000] +#select * from generate_series( +# timestamp '2008-03-01 00:00', +# timestamp '2008-03-04 12:00', #cast( '10' as interval hour)); % . # table_name % value # name 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 @@ -18,7 +18,7 @@ */ /* - * (c) Martin Kersten + * (c) Martin Kersten, Sjoerd Mullender * Series generating module for integer, decimal, real, double and timestamps. */ @@ -289,10 +289,11 @@ findLastAssign(MalBlkPtr mb, InstrPtr pc { InstrPtr q, p = NULL; int i; + str vaultRef = putName(vault,5); for (i = 1; i mb-stop; i++) { q = getInstrPtr(mb, i); - if (q-argv[0] == target) + if (q-argv[0] == target getModuleId(q) == vaultRef) p = q; if (q == pci) return p; @@ -759,16 +760,15 @@ str VLTgenerator_leftfetchjoin(Client cn /* The operands of a join operation can either be defined on a generator */ #define VLTjoin(TPE) \ - { TPE f,l,s;\ - TPE *v,w;\ + { 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);\ for( ; cnt 0; cnt--,os++,o++){\ v = (TPE*) Tloc(bl,BUNfirst(bl));\ - w = floor((*v -f)/s);\ - if ( *v = f *v l f + w * s == *v ){\ - *or++ = (oid) w;\ + w = (BUN) floor((*v -f)/s);\ + if ( *v = f *v l f + (TPE)(w * s) == *v ){\ + *or++ = w;\ *ol++ = *o;\ c++;\ }\ @@ -776,34 +776,46 @@ str VLTgenerator_leftfetchjoin(Client cn str VLTgenerator_join(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - BAT *bl, *br, *bln = NULL, *brn= NULL; + BAT *b, *bl = NULL, *br = NULL, *bln = NULL, *brn= NULL; BUN cnt,c =0; oid *o = 0, os= 0, *ol, *or; - int tpe,bid; - InstrPtr p = NULL; + int tpe; + InstrPtr p = NULL, q = NULL; str msg = MAL_SUCCEED; (void) cntxt; // we assume at most one of the arguments to refer to the generator - bl = BATdescriptor(bid = *(int*) getArgReference(stk,pci,2)); - if( bl == NULL) - throw(MAL,generator.join,RUNTIME_OBJECT_MISSING); - br = BATdescriptor(bid = *(int*) getArgReference(stk,pci,3)); - if( br == NULL){ - //BBPreleaseref(bl-batCacheid)); - throw(MAL,generator.join,RUNTIME_OBJECT_MISSING); + p = findLastAssign(mb,pci,pci-argv[2]); + if( p == NULL){ + bl = BATdescriptor(*(int*) getArgReference(stk,pci,2)); + if( bl == NULL) + throw(MAL,generator.join,RUNTIME_OBJECT_MISSING); + } + q = findLastAssign(mb,pci,pci-argv[3]); + if ( q == NULL){ + br = BATdescriptor(*(int*) getArgReference(stk,pci,3)); + if( br == NULL){ + BBPreleaseref(bl-batCacheid); + throw(MAL,generator.join,RUNTIME_OBJECT_MISSING); + } } - p = findLastAssign(mb,pci,pci-argv[3]); - assert(p); + // in case of both generators materialize the 'smallest' one first + // or implement more knowledge, postponed + assert(!( p q)); + assert(p || q); - cnt = BATcount(bl); - tpe = br-ttype; - if( bl-ttype == TYPE_void) - os = bl-tseqbase; + // switch roles to have a single target bat[:oid,:any] designated + // by b and reference instruction p for the generator + b = q? br : bl; + p = q? q : p; + cnt = BATcount(b); + tpe = b-ttype; + if( b-ttype == TYPE_void) + os = b-tseqbase; else - o = (oid*) Tloc(bl,BUNfirst(bl)); - +