Changeset: 16ba98a3221e for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=16ba98a3221e
Modified Files:
        gdk/gdk_sample.c
        sql/server/rel_select.c
        sql/server/sql_parser.y
        sql/server/sql_scan.c
        sql/server/sql_symbol.c
        sql/server/sql_symbol.h
Branch: stratified_sampling
Log Message:

add dbl type to sql parser


diffs (truncated from 346 to 300 lines):

diff --git a/gdk/gdk_sample.c b/gdk/gdk_sample.c
--- a/gdk/gdk_sample.c
+++ b/gdk/gdk_sample.c
@@ -267,18 +267,25 @@ BATweightedsample(BAT *b, BUN n, BAT *w)
        ERRORcheck(w->ttype != TYPE_dbl,
                                        "BATsample: type of weights must be 
doubles\n", NULL);//TODO types of w (want to remove this)
        //TODO: handle NULL values in w_ptr
+
        cnt = BATcount(b);
 
+       sample = COLnew(0, TYPE_oid, n, TRANSIENT);
+
+       if(sample == NULL)
+               return NULL;
+       if(n == 0)
+               return sample;
+
+
        keys = (dbl*) GDKmalloc(sizeof(dbl)*n);
-       if(keys == NULL)
-               return NULL;
-
-       sample = COLnew(0, TYPE_oid, n, TRANSIENT);
-       if(sample == NULL) {
-               free(keys);
+       if(keys == NULL) {
+               BBPunfix(sample->batCacheid);
                return NULL;
        }
 
+
+
        oids = (oid *) Tloc(sample, 0);
        w_ptr = (dbl*) Tloc(w, 0);
 
@@ -301,7 +308,7 @@ BATweightedsample(BAT *b, BUN n, BAT *w)
                i++;
        }
        if(i < n) {/* not enough non-zero weights: cannot take sample */
-               BBPunfix(sample->batCacheid);//TODO why not unfix?
+               BBPunfix(sample->batCacheid);
                GDKfree(keys);
                return NULL;
        }
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
@@ -4704,25 +4704,27 @@ rel_select_exp(mvc *sql, sql_rel *rel, S
        if (sn->sample) {
                list *exps = new_exp_list(sql->sa);
                if (sn->sample->token == SQL_WEIGHTED_SAMPLE) {
-                       // weighted sampling
-                       // parse the sample size and weight vector and pass it 
on to rel_sample
                        dlist *l = sn->sample->data.lval;
-
-                       lng sample_size = l->h->data.l_val;
-                       sql_exp* sample_size_exp = exp_atom_lng(sql->sa, 
sample_size);
+                       sql_exp* sample_size_exp = NULL;
 
                        exp_kind iek = {type_value, card_column, FALSE};
                        symbol* weights = l->h->next->data.sym;
                        sql_exp* weights_exp = rel_value_exp(sql, &rel, 
weights, 0, iek);
+
+                       if(l->h->type == type_lng) {
+                               lng sample_size = l->h->data.l_val;
+                               sample_size_exp = exp_atom_lng(sql->sa, 
sample_size);
+                       } else if(l->h->type == type_dbl) {
+                               dbl sampling_fraction = l->h->data.fval;
+                               sample_size_exp = exp_atom_dbl(sql->sa, 
sampling_fraction);
+                       }
+
                        if (!sample_size_exp || !weights_exp)
                                return NULL;
                        append(exps, sample_size_exp);
                        append(exps, weights_exp);
-
-                       weighted_sample = 1;
                } else {
-                       // uniform sampling
-                       // parse the sample size and pass it on to rel_sample
+                       /* uniform sampling */
                        sql_exp *o = rel_value_exp( sql, &rel, sn->sample, 0, 
ek);
                        if (!o)
                                return NULL;
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
@@ -41,6 +41,7 @@
 #define append_symbol(l,d)   dlist_append_symbol( SA, l, d)
 #define append_string(l,d)   dlist_append_string( SA, l, d)
 #define append_type(l,d)     dlist_append_type( SA, l, d)
+#define append_dbl(l,d)      dlist_append_dbl( SA, l, d)
 
 #define _atom_string(t, v)   atom_string(SA, t, v)
 
@@ -483,6 +484,10 @@ int yydebug=1;
        poslng
        nonzerolng
 
+%type <fval>
+       dblval
+       probdbl
+
 %type <bval>
        opt_brackets
 
@@ -512,7 +517,7 @@ int yydebug=1;
 
 /* sql prefixes to avoid name clashes on various architectures */
 %token <sval>
-       IDENT aTYPE ALIAS AGGR AGGR2 RANK sqlINT OIDNUM HEXADECIMAL INTNUM 
APPROXNUM 
+       IDENT aTYPE ALIAS AGGR AGGR2 RANK sqlINT OIDNUM HEXADECIMAL APPROXNUM 
sqlDBL
        USING 
        GLOBAL CAST CONVERT
        CHARACTER VARYING LARGE OBJECT VARCHAR CLOB sqlTEXT BINARY sqlBLOB
@@ -3328,17 +3333,24 @@ opt_sample:
                          sql_subtype *t = sql_bind_localtype("lng");
                          $$ = _newAtomNode( atom_int(SA, t, $2));
                        }
- |  SAMPLE INTNUM      {
+ |  SAMPLE probdbl     {
                          sql_subtype *t = sql_bind_localtype("dbl");
-                         $$ = _newAtomNode( atom_float(SA, t, 
strtod($2,NULL)));
+                         //$$ = _newAtomNode( atom_float(SA, t, 
strtod($2,NULL)));
+                         $$ = _newAtomNode( atom_float(SA, t, $2));
                        }
  |  SAMPLE param       { $$ = $2; }
- | SAMPLE poslng WITH WEIGHTS search_condition { 
-       dlist *l = L();
-       append_lng(l, $2);
-       append_symbol(l, $5);
-       $$ = _symbol_create_list(SQL_WEIGHTED_SAMPLE, l);
- }
+ |  SAMPLE poslng WITH WEIGHTS search_condition { 
+                       dlist *l = L();
+                       append_lng(l, $2);
+                       append_symbol(l, $5);
+                       $$ = _symbol_create_list(SQL_WEIGHTED_SAMPLE, l);
+               }
+ |  SAMPLE probdbl WITH WEIGHTS search_condition { 
+                       dlist *l = L();
+                       append_dbl(l, $2);
+                       append_symbol(l, $5);
+                       $$ = _symbol_create_list(SQL_WEIGHTED_SAMPLE, l);
+                }
  ;
 
 sort_specification_list:
@@ -4503,45 +4515,6 @@ literal:
                        $$ = _newAtomNode( atom_int(SA, &t, value));
                  }
                }
- |  INTNUM
-               { char *s = strip_extra_zeros(sa_strdup(SA, $1));
-                 char *dot = strchr(s, '.');
-                 int digits = _strlen(s) - 1;
-                 int scale = digits - (int) (dot-s);
-                 sql_subtype t;
-
-                 if (digits <= 0)
-                       digits = 1;
-                 if (digits <= MAX_DEC_DIGITS) {
-                       double val = strtod($1,NULL);
-#ifdef HAVE_HGE
-                       hge value = decimal_from_str(s, NULL);
-#else
-                       lng value = decimal_from_str(s, NULL);
-#endif
-
-                       if (*s == '+' || *s == '-')
-                               digits --;
-                       sql_find_subtype(&t, "decimal", digits, scale );
-                       $$ = _newAtomNode( atom_dec(SA, &t, value, val));
-                  } else {
-                       char *p = $1;
-                       double val;
-
-                       errno = 0;
-                       val = strtod($1,&p);
-                       if (p == $1 || val == dbl_nil || (errno == ERANGE && 
(val < -1 || val > 1))) {
-                               char *msg = sql_message("\b22003!double value 
too large or not a number (%s)", $1);
-
-                               yyerror(m, msg);
-                               _DELETE(msg);
-                               $$ = NULL;
-                               YYABORT;
-                       }
-                       sql_find_subtype(&t, "double", 51, 0 );
-                       $$ = _newAtomNode(atom_float(SA, &t, val));
-                  }
-               }
  |  APPROXNUM
                { sql_subtype t;
                  char *p = $1;
@@ -4688,6 +4661,19 @@ literal:
                { sql_subtype t;
                  sql_find_subtype(&t, "boolean", 0, 0 );
                  $$ = _newAtomNode( atom_bool(SA, &t, TRUE)); }
+ | sqlDBL
+               {
+                       sql_subtype *t= sql_bind_localtype("dbl");
+                       errno = 0;
+                       $$ = _newAtomNode( atom_float(SA, t, strtod($1,NULL)));
+                       if(errno) {
+                               char *msg = sql_message("\b22003!double value 
could not be parsed (%s)", $1);
+                               errno = 0;
+                               yyerror(m, msg);
+                               _DELETE(msg);
+                               YYABORT;
+                       }
+               }
  ;
 
 interval_expression:
@@ -4894,6 +4880,16 @@ poslng:
                }
        ;
 
+probdbl:
+       dblval {
+               $$ = $1;
+               if($$ < 0 || $$ > 1) {
+                       $$ = -1;
+                       yyerror(m, "Value between 0 and 1 expected");
+                       YYABORT;
+               }
+       };
+
 posint:
        intval  { $$ = $1;
                  if ($$ < 0) {
@@ -5312,7 +5308,24 @@ lngval:
                        $$ = 0;
                        YYABORT;
                  }
-               }
+               };
+
+dblval:
+       sqlDBL  
+               {
+                       errno = 0;
+                       
+                       $$ = strtod($1,NULL);
+                       
+                       if(errno) {
+                               char *msg = sql_message("\b22003!double value 
could not be parsed (%s)", $1);
+                               errno = 0;
+                               yyerror(m, msg);
+                               _DELETE(msg);
+                               $$ = -1;
+                               YYABORT;
+                       }
+               };
 
 intval:
        sqlINT  
diff --git a/sql/server/sql_scan.c b/sql/server/sql_scan.c
--- a/sql/server/sql_scan.c
+++ b/sql/server/sql_scan.c
@@ -888,7 +888,7 @@ number(mvc * c, int cur)
                }
 
                if (cur == '.') {
-                       token = INTNUM;
+                       token = sqlDBL;
        
                        while ((cur = scanner_getc(lc)) != EOF && 
iswdigit(cur)) 
                                ;
@@ -1315,7 +1315,7 @@ sqllex(YYSTYPE * yylval, void *parm)
                mnstr_write(lc->log, lc->rs->buf+pos, lc->rs->pos + lc->yycur - 
pos, 1);
 
        /* Don't include literals in the calculation of the key */
-       if (token != STRING && token != sqlINT && token != OIDNUM && token != 
INTNUM && token != APPROXNUM && token != sqlNULL)
+       if (token != STRING && token != sqlINT && token != OIDNUM && token != 
sqlDBL && token != APPROXNUM && token != sqlNULL)
                lc->key ^= token;
        lc->started += (token != EOF);
        return token;
diff --git a/sql/server/sql_symbol.c b/sql/server/sql_symbol.c
--- a/sql/server/sql_symbol.c
+++ b/sql/server/sql_symbol.c
@@ -172,6 +172,18 @@ dnode_create_type(sql_allocator *sa, sql
        return n;
 }
 
+static dnode *
+dnode_create_dbl(sql_allocator *sa, dbl data)
+{
+       dnode *n = dnode_create(sa);
+
+       if (n) {
+               n->data.fval = data;
+               n->type = type_dbl;
+       }
+       return n;
+}
+
 dlist *
 dlist_create(sql_allocator *sa)
 {
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to