Changeset: 8f8ccf405267 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8f8ccf405267
Modified Files:
sql/backends/monet5/generator/generator.c
Branch: generator
Log Message:
Fall back on leftfetch join if series is materialized
diffs (123 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
@@ -24,6 +24,7 @@
#include "monetdb_config.h"
#include "opt_prelude.h"
+#include "algebra.h"
#include "generator.h"
#include "mtime.h"
#include "math.h"
@@ -56,13 +57,13 @@ VLTgenerator_noop(Client cntxt, MalBlkPt
if (tpe == TYPE_timestamp){
s = *(timestamp*) getArgReference(stk,pci, 3);
if( timestamp_isnil(s)) nullerr++;
- } else throw(MAL,"vault.generator","unknown data type %d",
getArgType(mb,pci,1));
+ } else throw(MAL,"generator.noop","unknown data type %d",
getArgType(mb,pci,1));
}
}
if( zeroerror)
- throw(MAL,"vault.generator","zero step size not allowed");
+ throw(MAL,"generator.noop","zero step size not allowed");
if( nullerr)
- throw(MAL,"vault.generator","null step size not allowed");
+ throw(MAL,"generator.noop","null step size not allowed");
return MAL_SUCCEED;
}
@@ -202,20 +203,18 @@ VLTgenerator_table(Client cntxt, MalBlkP
/*
* Selection over the generator table does not require a materialization of
the table
* An optimizer can replace the subselect directly into a generator specific
one.
- * The target to look for is vault.generator(A1,A2,A3)
+ * The target to look for is generator.series(A1,A2,A3)
* We need the generator parameters, which are injected to replace the target
column
*/
static InstrPtr
-findLastAssign(MalBlkPtr mb, InstrPtr pci, int target)
+findGeneratorDefinition(MalBlkPtr mb, InstrPtr pci, int target)
{
InstrPtr q, p = NULL;
int i;
- str vaultRef = putName("vault",5);
- str generatorRef = putName("generator",9);
for (i = 1; i < mb->stop; i++) {
q = getInstrPtr(mb, i);
- if (q->argv[0] == target && (getModuleId(q) == vaultRef ||
getModuleId(q) == generatorRef))
+ if (q->argv[0] == target && getModuleId(q) == generatorRef &&
getFunctionId(q) == parametersRef)
p = q;
if (q == pci)
return p;
@@ -309,7 +308,7 @@ VLTgenerator_subselect(Client cntxt, Mal
int tpe;
(void) cntxt;
- p = findLastAssign(mb, pci, pci->argv[1]);
+ p = findGeneratorDefinition(mb, pci, pci->argv[1]);
if (p == NULL)
throw(MAL, "generator.subselect",
"Could not locate definition for object");
@@ -576,7 +575,7 @@ str VLTgenerator_thetasubselect(Client c
str oper, msg= MAL_SUCCEED;
(void) cntxt;
- p = findLastAssign(mb,pci,pci->argv[1]);
+ p = findGeneratorDefinition(mb,pci,pci->argv[1]);
if( p == NULL)
throw(MAL,"generator.thetasubselect","Could not locate
definition for object");
@@ -706,7 +705,7 @@ wrapup:
str VLTgenerator_leftfetchjoin(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci)
{
- int bid =0, c= 0, tpe;
+ int bid =0, c= 0, tpe, *ret;
BAT *b, *bn = NULL;
BUN cnt;
oid *ol =0, o= 0;
@@ -714,14 +713,23 @@ str VLTgenerator_leftfetchjoin(Client cn
str msg;
(void) cntxt;
- p = findLastAssign(mb,pci,pci->argv[2]);
- // if it does not exist we should fall back to the ordinary join to try
- if( p == NULL)
- throw(MAL,"generator.leftfetchjoin","Could not locate
definition for object");
+ p = findGeneratorDefinition(mb,pci,pci->argv[2]);
+ ret = (int*) getArgReference(stk,pci,0);
b = BATdescriptor(bid = *(int*) getArgReference(stk,pci,1));
if( b == NULL)
throw(MAL,"generator.leftfetchjoin",RUNTIME_OBJECT_MISSING);
+
+ // if it does not exist we should fall back to the ordinary
leftfetchjoin to try
+ // it might have been materialized already
+ if( p == NULL){
+ bn = BATdescriptor( *(int*) getArgReference(stk,pci,2));
+ if( bn == NULL)
+
throw(MAL,"generator.leftfetchjoin",RUNTIME_OBJECT_MISSING);
+ msg = ALGleftfetchjoin(ret, &b->batCacheid, &bn->batCacheid);
+ return msg;
+ }
+
cnt = BATcount(b);
if ( b->ttype == TYPE_void)
o = b->tseqbase;
@@ -821,13 +829,13 @@ str VLTgenerator_join(Client cntxt, MalB
(void) cntxt;
// we assume at most one of the arguments to refer to the generator
- p = findLastAssign(mb,pci,pci->argv[2]);
+ p = findGeneratorDefinition(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]);
+ q = findGeneratorDefinition(mb,pci,pci->argv[3]);
if ( q == NULL){
br = BATdescriptor(*(int*) getArgReference(stk,pci,3));
if( br == NULL){
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list