Changeset: d5d9b1684efd for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d5d9b1684efd
Modified Files:
clients/Tests/exports.stable.out
gdk/xoshiro128starstar.h
monetdb5/modules/mal/sample.c
monetdb5/modules/mal/sample.h
monetdb5/modules/mal/sample.mal
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_statement.c
sql/backends/monet5/sql_statement.h
sql/server/rel_select.c
sql/server/sql_parser.h
sql/server/sql_parser.y
sql/server/sql_scan.c
sql/test/BugTracker/Tests/drop_sequence_crash.SF-1505973.sql
sql/test/BugTracker/Tests/drop_sequence_crash_2.SF-1505973.sql
Branch: sample-with-seed
Log Message:
Use mal pattern instead of command.
diffs (truncated from 374 to 300 lines):
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -164,6 +164,7 @@ gdk_return BATreplace(BAT *b, BAT *p, BA
void BATrmprop(BAT *b, int idx);
gdk_return BATroles(BAT *b, const char *tnme);
BAT *BATsample(BAT *b, BUN n);
+BAT *BATsample_with_seed(BAT *b, BUN n, uint32_t seed);
BAT *BATselect(BAT *b, BAT *s, const void *tl, const void *th, bool li, bool
hi, bool anti);
gdk_return BATsemijoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr,
bool nil_matches, BUN estimate) __attribute__((__warn_unused_result__));
gdk_return BATsetaccess(BAT *b, int mode);
@@ -1732,8 +1733,7 @@ str SABmarchConnection(void *ret, str *h
str SABmarchScenario(void *ret, str *lang);
str SABprelude(void *ret);
str SABretreatScenario(void *ret, str *lang);
-str SAMPLEuniform(bat *r, bat *b, lng *s);
-str SAMPLEuniform_dbl(bat *r, bat *b, dbl *p);
+str SAMPLEuniform(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
str SERVERbindBAT(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
str SERVERclient(void *res, const Stream *In, const Stream *Out);
str SERVERconnect(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pc);
diff --git a/gdk/xoshiro128starstar.h b/gdk/xoshiro128starstar.h
--- a/gdk/xoshiro128starstar.h
+++ b/gdk/xoshiro128starstar.h
@@ -10,7 +10,7 @@ typedef uint32_t random_state_engine[4];
void init_random_state_engine(random_state_engine* engine, uint32_t seed);
void init_random_state_engine(random_state_engine* engine, uint32_t seed) {
- random_state_engine s = { seed };
+ random_state_engine s = { seed << 1, seed + 1, seed >> 1, seed - 1 };
memcpy(engine, &s, sizeof(random_state_engine));
}
diff --git a/monetdb5/modules/mal/sample.c b/monetdb5/modules/mal/sample.c
--- a/monetdb5/modules/mal/sample.c
+++ b/monetdb5/modules/mal/sample.c
@@ -33,7 +33,7 @@
#include "gdk.h"
#include "mal_exception.h"
#include "sample.h"
-
+// TODO: Go through this documentation.
/*
* @- Uniform Sampling.
*
@@ -68,39 +68,51 @@
*/
str
-SAMPLEuniform(bat *r, bat *b, lng *s) {
+SAMPLEuniform(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) {
+
+ bat *r, *b;
+ lng sample_size;
+ int seed;
+ (void) cntxt;
+
BAT *br, *bb;
+ r = getArgReference_bat(stk, pci, 0);
+ b = getArgReference_bat(stk, pci, 1);\
+
if ((bb = BATdescriptor(*b)) == NULL) {
throw(MAL, "sample.subuniform", INTERNAL_BAT_ACCESS);
}
- br = BATsample(bb, (BUN) *s);
+
+ if ((getArgType(mb, pci, 2) == TYPE_dbl))
+ {
+ dbl pr = *getArgReference_dbl(stk, pci, 2);
+
+ if ( pr < 0.0 || pr > 1.0 ) {
+ throw(MAL, "sample.subuniform", ILLEGAL_ARGUMENT
+ " p should be between 0 and 1.0" );
+ } else if (pr == 0) {/* special case */
+ sample_size = 0;
+ // TODO: Add special case for pr == 1.0.
+ } else {
+ sample_size = (lng) (pr*(double)BATcount(bb));
+ }
+ } else {
+ sample_size = *getArgReference_lng(stk, pci, 2);
+ }
+
+ if (pci->argc == 4) {
+ seed = *getArgReference_int(stk, pci, 3);
+ br = BATsample_with_seed(bb, (BUN) sample_size, seed);
+ }
+ else {
+ br = BATsample(bb, (BUN) sample_size);
+ }
+
BBPunfix(bb->batCacheid);
if (br == NULL)
throw(MAL, "sample.subuniform", OPERATION_FAILED);
BBPkeepref(*r = br->batCacheid);
return MAL_SUCCEED;
-
}
-
-str
-SAMPLEuniform_dbl(bat *r, bat *b, dbl *p) {
- BAT *bb;
- double pr = *p;
- lng s;
-
- if ( pr < 0.0 || pr > 1.0 ) {
- throw(MAL, "sample.subuniform", ILLEGAL_ARGUMENT
- " p should be between 0 and 1.0" );
- } else if (pr == 0) {/* special case */
- s = 0;
- return SAMPLEuniform(r, b, &s);
- }
- if ((bb = BATdescriptor(*b)) == NULL) {
- throw(MAL, "sample.subuniform", INTERNAL_BAT_ACCESS);
- }
- s = (lng) (pr*(double)BATcount(bb));
- BBPunfix(bb->batCacheid);
- return SAMPLEuniform(r, b, &s);
-}
diff --git a/monetdb5/modules/mal/sample.h b/monetdb5/modules/mal/sample.h
--- a/monetdb5/modules/mal/sample.h
+++ b/monetdb5/modules/mal/sample.h
@@ -17,10 +17,10 @@
/* #define _DEBUG_SAMPLE_ */
+
+#include "mal_interpreter.h"
+
mal_export str
-SAMPLEuniform(bat *r, bat *b, lng *s);
-
-mal_export str
-SAMPLEuniform_dbl(bat *r, bat *b, dbl *p);
+SAMPLEuniform(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
#endif
diff --git a/monetdb5/modules/mal/sample.mal b/monetdb5/modules/mal/sample.mal
--- a/monetdb5/modules/mal/sample.mal
+++ b/monetdb5/modules/mal/sample.mal
@@ -12,10 +12,14 @@
module sample;
-command subuniform(b:bat[:any],s:lng):bat[:oid]
+pattern subuniform(b:bat[:any],sample_size:lng):bat[:oid]
address SAMPLEuniform
comment "Returns the oids of a uniform sample of size s";
-command subuniform(b:bat[:any],p:dbl):bat[:oid]
-address SAMPLEuniform_dbl
+pattern subuniform(b:bat[:any],sample_size:lng,sample_seed:int):bat[:oid]
+address SAMPLEuniform
+comment "Returns the oids of a uniform sample of size s";
+
+pattern subuniform(b:bat[:any],p:dbl):bat[:oid]
+address SAMPLEuniform
comment "Returns the oids of a uniform sample of size = (p x count(b)), where
0 <= p <= 1.0";
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -2925,7 +2925,7 @@ rel2bin_sample(backend *be, sql_rel *rel
{
mvc *sql = be->mvc;
list *newl;
- stmt *sub = NULL, *s = NULL, *sample = NULL;
+ stmt *sub = NULL, *sample_size = NULL, *sample = NULL, *seed = NULL;
node *n;
if (rel->l) /* first construct the sub relation */
@@ -2941,13 +2941,17 @@ rel2bin_sample(backend *be, sql_rel *rel
const char *cname = column_name(sql->sa, sc);
const char *tname = table_name(sql->sa, sc);
- s = exp_bin(be, rel->exps->h->data, NULL, NULL, NULL, NULL,
NULL, NULL);
-
- if (!s)
- s = stmt_atom_lng_nil(be);
+ sample_size = exp_bin(be, rel->exps->h->data, NULL, NULL, NULL,
NULL, NULL, NULL);
+
+ if (!sample_size)
+ sample_size = stmt_atom_lng_nil(be);
+
+ if (rel->exps->cnt == 2) {
+ seed = exp_bin(be, rel->exps->h->next->data, NULL,
NULL, NULL, NULL, NULL, NULL);
+ }
sc = column(be, sc);
- sample = stmt_sample(be, stmt_alias(be, sc, tname, cname),s);
+ sample = stmt_sample(be, stmt_alias(be, sc, tname,
cname),sample_size, seed);
for ( ; n; n = n->next) {
stmt *sc = n->data;
diff --git a/sql/backends/monet5/sql_statement.c
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -1141,7 +1141,7 @@ stmt_limit(backend *be, stmt *col, stmt
}
stmt *
-stmt_sample(backend *be, stmt *s, stmt *sample)
+stmt_sample(backend *be, stmt *s, stmt *sample, stmt *seed)
{
MalBlkPtr mb = be->mb;
InstrPtr q = NULL;
@@ -1151,6 +1151,14 @@ stmt_sample(backend *be, stmt *s, stmt *
q = newStmt(mb, sampleRef, subuniformRef);
q = pushArgument(mb, q, s->nr);
q = pushArgument(mb, q, sample->nr);
+
+ if (seed) {
+ if (seed->nr < 0)
+ return NULL;
+
+ q = pushArgument(mb, q, seed->nr);
+ }
+
if (q) {
stmt *ns = stmt_create(be->mvc->sa, st_sample);
if (ns == NULL) {
@@ -1160,6 +1168,11 @@ stmt_sample(backend *be, stmt *s, stmt *
ns->op1 = s;
ns->op2 = sample;
+
+ if (seed) {
+ ns->op3 = seed;
+ }
+
ns->nrcols = s->nrcols;
ns->key = s->key;
ns->aggr = s->aggr;
diff --git a/sql/backends/monet5/sql_statement.h
b/sql/backends/monet5/sql_statement.h
--- a/sql/backends/monet5/sql_statement.h
+++ b/sql/backends/monet5/sql_statement.h
@@ -210,7 +210,7 @@ extern stmt *stmt_result(backend *be, st
* order: is order important or not (firstn vs slice)
*/
extern stmt *stmt_limit(backend *sa, stmt *c, stmt *piv, stmt *gid, stmt
*offset, stmt *limit, int distinct, int dir, int last, int order);
-extern stmt *stmt_sample(backend *be, stmt *s, stmt *sample);
+extern stmt *stmt_sample(backend *be, stmt *s, stmt *sample, stmt *seed);
extern stmt *stmt_order(backend *be, stmt *s, int direction);
extern stmt *stmt_reorder(backend *be, stmt *s, int direction, stmt
*orderby_ids, stmt *orderby_grp);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -5194,10 +5194,21 @@ rel_select_exp(mvc *sql, sql_rel *rel, S
if (sn->sample) {
list *exps = new_exp_list(sql->sa);
- sql_exp *o = rel_value_exp( sql, NULL, sn->sample, 0, ek);
- if (!o)
+
+ // TODO: add documentation
+
+ dlist* sample_parameters = sn->sample->data.lval;
+
+ sql_exp *sample_size = rel_value_exp( sql, NULL,
sample_parameters->h->data.sym, 0, ek);
+ if (!sample_size)
return NULL;
- append(exps, o);
+ append(exps, sample_size);
+
+ if (sample_parameters->cnt == 2) {
+ sql_exp *seed_value = rel_value_exp( sql, NULL,
sample_parameters->h->next->data.sym, 0, ek);
+ append(exps, seed_value);
+ }
+
rel = rel_sample(sql->sa, rel, exps);
}
diff --git a/sql/server/sql_parser.h b/sql/server/sql_parser.h
--- a/sql/server/sql_parser.h
+++ b/sql/server/sql_parser.h
@@ -52,6 +52,7 @@ typedef enum tokens {
SQL_DECLARE_TABLE,
SQL_COMMENT,
SQL_SET,
+ SQL_SAMPLE,
SQL_CALL,
SQL_PREP,
SQL_PREPARE,
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -620,7 +620,7 @@ SQLCODE SQLERROR UNDER WHENEVER
%token ALTER ADD TABLE COLUMN TO UNIQUE VALUES VIEW WHERE WITH
%token<sval> sqlDATE TIME TIMESTAMP INTERVAL
%token YEAR QUARTER MONTH WEEK DAY HOUR MINUTE SECOND ZONE
-%token LIMIT OFFSET SAMPLE
+%token LIMIT OFFSET SAMPLE SEED
%token CASE WHEN THEN ELSE NULLIF COALESCE IF ELSEIF WHILE DO
%token ATOMIC BEGIN END
@@ -3591,14 +3591,37 @@ opt_offset:
opt_sample:
/* empty */ { $$ = NULL; }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list