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

Reply via email to