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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list