Changeset: 6f7568c33ad3 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6f7568c33ad3
Modified Files:
Branch: default
Log Message:
merge
diffs (truncated from 1447 to 300 lines):
diff --git a/clients/odbc/driver/SQLPrepare.c b/clients/odbc/driver/SQLPrepare.c
--- a/clients/odbc/driver/SQLPrepare.c
+++ b/clients/odbc/driver/SQLPrepare.c
@@ -94,8 +94,8 @@ SQLPrepare_(ODBCStmt *stmt,
#ifdef ODBCDEBUG
ODBCLOG("SQLPrepare: \"%s\"\n", query);
#endif
- s = malloc(strlen(query) + 15);
- strcat(strcpy(s, "prepareresult "), query);
+ s = malloc(strlen(query) + 9);
+ strcat(strcpy(s, "prepare "), query);
free(query);
ODBCResetStmt(stmt);
diff --git a/java/src/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
b/java/src/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
--- a/java/src/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
+++ b/java/src/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
@@ -115,7 +115,7 @@ public class MonetPreparedStatement
resultSetHoldability
);
- if (!super.execute("PREPARERESULT " + prepareQuery))
+ if (!super.execute("PREPARE " + prepareQuery))
throw new SQLException("Unexpected server response",
"M0M10");
// cheat a bit to get the ID and the number of columns
diff --git a/monetdb5/modules/atoms/mtime.mx b/monetdb5/modules/atoms/mtime.mx
--- a/monetdb5/modules/atoms/mtime.mx
+++ b/monetdb5/modules/atoms/mtime.mx
@@ -862,7 +862,7 @@ command daytime(t:timestamp) :daytime ad
typedef int date;
#define date_nil ((date) int_nil)
-#define date_isnil(X) (X == date_nil)
+#define date_isnil(X) ((X) == date_nil)
@c
#include "monetdb_config.h"
#include "mtime.h"
@@ -875,7 +875,7 @@ typedef int date;
*/
typedef int daytime;
#define daytime_nil ((daytime) int_nil)
-#define daytime_isnil(X) ( X == (daytime) int_nil)
+#define daytime_isnil(X) ((X) == daytime_nil)
/*
* @- timestamp
diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx
--- a/sql/backends/monet5/sql.mx
+++ b/sql/backends/monet5/sql.mx
@@ -4186,7 +4186,7 @@ daytime_2time_daytime( daytime *res, day
/* correct fraction */
*res = *v;
- if (d < 3) {
+ if (!daytime_isnil(*v) && d < 3) {
*res /= scales[3-d];
*res *= scales[3-d];
}
@@ -5613,6 +5613,10 @@ second_interval_daytime( lng *res, dayti
lng r = *(int*)s;
(void)sk;
+ if (daytime_isnil(*s)) {
+ *res = lng_nil;
+ return MAL_SUCCEED;
+ }
switch(k) {
case isec:
break;
diff --git a/sql/backends/monet5/sql_result.mx
b/sql/backends/monet5/sql_result.mx
--- a/sql/backends/monet5/sql_result.mx
+++ b/sql/backends/monet5/sql_result.mx
@@ -158,8 +158,15 @@ sql_time_tostr(void *TS_RES, char **buf,
tmp = (daytime) val;
len1 = daytime_tostr(&s1, &big, &tmp);
- if (len1 == 3 && strcmp(s1, "nil") == 0)
+ if (len1 == 3 && strcmp(s1, "nil") == 0) {
+ if (*len < 4 || *buf == NULL) {
+ if (*buf)
+ GDKfree(*buf);
+ *buf = (str) GDKmalloc(*len = 4);
+ }
+ strcpy(*buf, s1);
return len1;
+ }
/* fixup the fraction, default is 3 */
len1 += (ts_res->fraction-3);
@@ -679,12 +686,11 @@ mvc_export_prepare(mvc *c, stream *out,
int len2 = 1, len3 = 1;
sql_arg *a;
sql_subtype *t;
- int result = (c->emode == m_prepareresult);
if (!out)
return 0;
- if (result && is_project(q->rel->op) && q->rel->exps) {
+ if (is_project(q->rel->op) && q->rel->exps) {
unsigned int max2 = 10, max3 = 10; /* to help calculate widths
*/
sql_rel *r = q->rel;
@@ -746,27 +752,17 @@ mvc_export_prepare(mvc *c, stream *out,
}
/* write header, query type: Q_PREPARE */
- if (result) {
- if (mnstr_printf(out,
- "&5 %d %d 6 %d\n" /* TODO: add type here: r(esult) or
u(pdate) */
- "%%
.prepare,\t.prepare,\t.prepare,\t.prepare,\t.prepare,\t.prepare # table_name\n"
- "%% type,\tdigits,\tscale,\tschema,\ttable,\tcolumn #
name\n"
- "%% varchar,\tint,\tint,\tstr,\tstr,\tstr # type\n"
- "%% " SZFMT ",\t%d,\t%d,\t" SZFMT ",\t" SZFMT ",\t"
SZFMT " # length\n",
- q->id, nrows, nrows, len1, len2, len3, len4, len5,
len6) < 0)
- return -1;
- } else {
- if (mnstr_printf(out,
- "&5 %d %d 3 %d\n" /* TODO: add type here: r(esult) or
u(pdate) */
- "%% .prepare,\t.prepare,\t.prepare # table_name\n"
- "%% type,\tdigits,\tscale # name\n"
- "%% varchar,\tint,\tint # type\n"
- "%% " SZFMT ",\t%d,\t%d # length\n",
- q->id, nrows, nrows, len1, len2, len3) < 0)
- return -1;
+ if (mnstr_printf(out,
+ "&5 %d %d 6 %d\n" /* TODO: add type here: r(esult) or
u(pdate) */
+ "%%
.prepare,\t.prepare,\t.prepare,\t.prepare,\t.prepare,\t.prepare # table_name\n"
+ "%% type,\tdigits,\tscale,\tschema,\ttable,\tcolumn #
name\n"
+ "%% varchar,\tint,\tint,\tstr,\tstr,\tstr # type\n"
+ "%% " SZFMT ",\t%d,\t%d,\t" SZFMT ",\t" SZFMT ",\t"
SZFMT " # length\n",
+ q->id, nrows, nrows, len1, len2, len3, len4, len5,
len6) < 0) {
+ return -1;
}
- if (result && is_project(q->rel->op) && q->rel->exps) {
+ if (is_project(q->rel->op) && q->rel->exps) {
sql_rel *r = q->rel;
for (n = r->exps->h; n; n = n->next) {
@@ -795,24 +791,20 @@ mvc_export_prepare(mvc *c, stream *out,
}
}
if (c->params) {
- char *extra = "";
int i;
q->paramlen = nparam;
q->params = SA_NEW_ARRAY(q->sa, sql_subtype, nrows);
- if (result)
- extra = ",\tNULL,\tNULL,\tNULL";
for (n = c->params->h, i=0; n; n = n->next, i++) {
a = n->data;
t = &a->type;
if (t) {
if (mnstr_printf(out,
- "[ \"%s\",\t%d,\t%d%s\t]\n",
+ "[
\"%s\",\t%d,\t%d,\tNULL,\tNULL,\tNULL\t]\n",
t->type->sqlname,
t->digits,
- t->scale,
- extra
+ t->scale
) < 0) {
return -1;
}
diff --git a/sql/backends/monet5/sql_scenario.c
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -392,10 +392,10 @@ sql_update_dec2011( Client c, mvc *m )
if (c->type.type->eclass == EC_INTERVAL
&&
strcmp(c->type.type->sqlname,
"sec_interval") == 0) {
- while (bufsize < pos + 100 +
strlen(s->base.name) + strlen(t->base.name) + 2*strlen(c->base.name))
+ while (bufsize < pos + 100 +
strlen(s->base.name) + strlen(t->base.name) + 3*strlen(c->base.name))
buf = GDKrealloc(buf,
bufsize += 1024);
- pos += snprintf(buf+pos,
bufsize-pos, "update \"%s\".\"%s\" set \"%s\"=1000*\"%s\";\n",
- s->base.name,
t->base.name, c->base.name, c->base.name);
+ pos += snprintf(buf+pos,
bufsize-pos, "update \"%s\".\"%s\" set \"%s\"=1000*\"%s\" where \"%s\" is not
null;\n",
+ s->base.name,
t->base.name, c->base.name, c->base.name, c->base.name);
}
}
}
@@ -1395,13 +1395,11 @@ SQLparser(Client c)
/* generate and call the MAL code */
if (m->emode == m_explain)
SQLshowPlan(c);
- if (m->emode == m_dot)
- SQLshowDot(c);
if (m->emod & mod_trace)
SQLsetTrace(be, c, TRUE);
if (m->emod & mod_debug)
SQLsetDebugger(c, m, TRUE);
- if ((m->emode != m_inplace && m->emode != m_prepare && m->emode
!= m_prepareresult && !m->caching && m->emode != m_explain && m->emode !=
m_dot) || s->type == st_none || m->type == Q_TRANS) {
+ if ((m->emode != m_inplace && m->emode != m_prepare &&
!m->caching && m->emode != m_explain ) || s->type == st_none || m->type ==
Q_TRANS) {
InstrPtr p;
MalBlkPtr curBlk;
@@ -1418,6 +1416,8 @@ SQLparser(Client c)
if (m->emode == m_inplace)
m->emode = m_normal;
+ if (m->emode == m_dot)
+ SQLshowDot(c);
} else {
/* generate a factory instantiation */
be->q = qc_insert(m->qc,
@@ -1427,7 +1427,7 @@ SQLparser(Client c)
m->args, /* the argument list */
m->argc,
m->scanner.key ^
m->session->schema->base.id, /* the statement hash key */
- (m->emode == m_prepare || m->emode ==
m_prepareresult) ? Q_PREPARE :
+ m->emode == m_prepare ? Q_PREPARE :
m->type, /* the type of the statement
*/
sql_escape_str(QUERY(m->scanner)));
scanner_query_processed(&(m->scanner));
@@ -1446,7 +1446,7 @@ SQLparser(Client c)
}
}
if (be->q) {
- if (m->emode == m_prepare || m->emode == m_prepareresult)
+ if (m->emode == m_prepare)
err = mvc_export_prepare(m, c->fdout, be->q, "");
else if (m->emode == m_inplace) {
/* everything ready for a fast call */
@@ -1637,7 +1637,7 @@ SQLengineIntern(Client c, backend *be)
msg = SQLexecutePrepared(c, be, be->q );
goto cleanup_engine;
}
- if( m->emode == m_prepare || m->emode == m_prepareresult){
+ if( m->emode == m_prepare){
goto cleanup_engine;
} else if (m->emode == m_explain || m->emode == m_dot) {
/*
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -5551,7 +5551,7 @@ _rel_optimizer(mvc *sql, sql_rel *rel, i
rel = rewrite(sql, rel, &rel_remove_empty_select, &e_changes);
}
- if (gp.cnt[op_select] && (!sql->emode == m_prepare || !sql->emode ==
m_prepareresult))
+ if (gp.cnt[op_select] && !sql->emode == m_prepare)
rel = rewrite(sql, rel, &rel_simplify_like_select, &changes);
if (gp.cnt[op_select])
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
@@ -4334,7 +4334,7 @@ rel_value_exp2(mvc *sql, sql_rel **rel,
return NULL;
}
case SQL_PARAMETER:{
- if (sql->emode != m_prepare && sql->emode != m_prepareresult)
+ if (sql->emode != m_prepare)
return sql_error(sql, 02, "SELECT: parameters ('?') not
allowed in normal queries, use PREPARE");
assert(se->type == type_int);
return exp_atom_ref(sql->sa, se->data.i_val, NULL);
diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h
--- a/sql/server/sql_mvc.h
+++ b/sql/server/sql_mvc.h
@@ -48,7 +48,6 @@
#define m_prepare 3
#define m_explain 4
#define m_plan 5
-#define m_prepareresult 6
#define m_dot 8
/* special modes for function/procedure and view instantiation and
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
@@ -544,7 +544,7 @@ SQLCODE SQLERROR UNDER WHENEVER
%token CHECK CONSTRAINT CREATE
%token TYPE PROCEDURE FUNCTION AGGREGATE RETURNS EXTERNAL sqlNAME DECLARE
%token CALL LANGUAGE
-%token SQL_EXPLAIN SQL_PLAN SQL_DEBUG SQL_TRACE SQL_DOT PREPARE PREPARERESULT
EXECUTE
+%token SQL_EXPLAIN SQL_PLAN SQL_DEBUG SQL_TRACE SQL_DOT PREPARE EXECUTE
%token DEFAULT DISTINCT DROP
%token FOREIGN
%token RENAME ENCRYPTED UNENCRYPTED PASSWORD GRANT REVOKE ROLE ADMIN INTO
@@ -595,20 +595,6 @@ sqlstmt:
}
YYACCEPT;
}
- | PREPARERESULT { mvc *m = (mvc*)parm;
- m->emode = m_prepareresult;
- m->scanner.as = m->scanner.yycur;
- m->scanner.key = 0;
- }
- sql SCOLON { mvc *m = (mvc*)parm;
- if (m->sym) {
- append_symbol(m->sym->data.lval, $3);
- $$ = m->sym;
- } else {
- m->sym = $$ = $3;
- }
- YYACCEPT;
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list