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