Changeset: 373b1b4e4b8a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=373b1b4e4b8a
Modified Files:
clients/odbc/driver/SQLPrepare.c
java/src/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
sql/backends/monet5/sql_result.mx
sql/backends/monet5/sql_scenario.c
sql/server/rel_optimizer.c
sql/server/rel_select.c
sql/server/sql_mvc.h
sql/server/sql_parser.y
sql/server/sql_scan.c
sql/test/BugDay_2005-12-19_2.9.3/Tests/prepare-where.SF-1238867.1238959.1238965.1240124.stable.err
sql/test/BugDay_2005-12-19_2.9.3/Tests/prepare-where.SF-1238867.1238959.1238965.1240124.stable.out
sql/test/BugDay_2005-12-19_2.9.3/Tests/prepare_doesnot_like_LIKE.SF-1234205.stable.out
sql/test/BugTracker-2009/Tests/decimal_needs_truncation.SF-2605686.stable.out
sql/test/BugTracker-2009/Tests/prepare_commit_execute.SF-2606020.stable.out
sql/test/BugTracker-2009/Tests/prepare_decimal_bug.SF-2831994.stable.out
sql/test/BugTracker-2010/Tests/crash_with_prepare_statement.Bug-2549.stable.out
sql/test/BugTracker-2010/Tests/limit_in_prepare.Bug-2552.stable.out
sql/test/BugTracker-2010/Tests/prepare_on_boolean_bug.Bug-2581.stable.out
sql/test/BugTracker-2010/Tests/prepare_statements_crash_server.Bug-2599.stable.out
sql/test/BugTracker-2010/Tests/prepare_stmt.Bug-2533.Bug-2534.stable.err
sql/test/BugTracker-2010/Tests/prepare_stmt.Bug-2533.Bug-2534.stable.out
sql/test/BugTracker/Tests/bind_with_cast.SF-1720934.stable.err
sql/test/BugTracker/Tests/bind_with_cast.SF-1720934.stable.out
sql/test/BugTracker/Tests/decimal_prepare.SF-1655818.stable.out
sql/test/BugTracker/Tests/large_prepare.SF-1363729.stable.out
sql/test/BugTracker/Tests/large_prepare_2.SF-1363729.stable.out
sql/test/BugTracker/Tests/prepare_decimal_float.SF-1675795.stable.out
Branch: Dec2011
Log Message:
PREPARERESULT is now PREPARE.
parameters can be reliably recognized by a NULL column name (as
opposed to an empty string).
diffs (truncated from 1070 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/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
@@ -679,12 +679,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 +745,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 +784,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
@@ -1389,7 +1389,7 @@ SQLparser(Client c)
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) || 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;
@@ -1415,7 +1415,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));
@@ -1434,7 +1434,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 */
@@ -1626,7 +1626,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 ){
/*
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
@@ -5365,7 +5365,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
@@ -4350,7 +4350,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
/* special modes for function/procedure and view instantiation and
dependency generation */
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
@@ -535,7 +535,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 PREPARE PREPARERESULT EXECUTE
+%token SQL_EXPLAIN SQL_PLAN SQL_DEBUG SQL_TRACE PREPARE EXECUTE
%token DEFAULT DISTINCT DROP
%token FOREIGN
%token RENAME ENCRYPTED UNENCRYPTED PASSWORD GRANT REVOKE ROLE ADMIN INTO
@@ -586,20 +586,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;
- }
| SQL_PLAN { mvc *m = (mvc*)parm;
m->emode = m_plan;
m->scanner.as = m->scanner.yycur;
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
@@ -285,7 +285,6 @@ scanner_init_keywords(void)
keywords_insert("DEBUG", SQL_DEBUG);
keywords_insert("TRACE", SQL_TRACE);
keywords_insert("PREPARE", PREPARE);
- keywords_insert("PREPARERESULT", PREPARERESULT);
keywords_insert("PREP", PREPARE);
keywords_insert("EXECUTE", EXECUTE);
keywords_insert("EXEC", EXECUTE);
diff --git
a/sql/test/BugDay_2005-12-19_2.9.3/Tests/prepare-where.SF-1238867.1238959.1238965.1240124.stable.err
b/sql/test/BugDay_2005-12-19_2.9.3/Tests/prepare-where.SF-1238867.1238959.1238965.1240124.stable.err
---
a/sql/test/BugDay_2005-12-19_2.9.3/Tests/prepare-where.SF-1238867.1238959.1238965.1240124.stable.err
+++
b/sql/test/BugDay_2005-12-19_2.9.3/Tests/prepare-where.SF-1238867.1238959.1238965.1240124.stable.err
@@ -10,10 +10,10 @@ stderr of test 'prepare-where.SF-1238867
# 13:00:07 > Mtimeout -timeout 60 MapiClient -lsql -u monetdb -P monetdb
--host=localhost --port=41457 <
prepare-where.SF-1238867.1238959.1238965.1240124.sql
# 13:00:07 >
-MAPI = monetdb@ottar:34070
+MAPI = monetdb@madrid:32243
QUERY = prepare select * from env() as env where ? = ?;
ERROR = !Cannot have a parameter (?) on both sides of an expression
-MAPI = monetdb@ottar:34070
+MAPI = monetdb@madrid:32243
QUERY = prepare select ? from env() as env;
ERROR = !SELECT: subquery result missing
diff --git
a/sql/test/BugDay_2005-12-19_2.9.3/Tests/prepare-where.SF-1238867.1238959.1238965.1240124.stable.out
b/sql/test/BugDay_2005-12-19_2.9.3/Tests/prepare-where.SF-1238867.1238959.1238965.1240124.stable.out
---
a/sql/test/BugDay_2005-12-19_2.9.3/Tests/prepare-where.SF-1238867.1238959.1238965.1240124.stable.out
+++
b/sql/test/BugDay_2005-12-19_2.9.3/Tests/prepare-where.SF-1238867.1238959.1238965.1240124.stable.out
@@ -13,23 +13,30 @@ stdout of test 'prepare-where.SF-1238867
Ready.
+# 12:37:36 >
+# 12:37:36 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=madrid"
"--port=32243"
+# 12:37:36 >
-# 11:51:01 >
-# 11:51:01 > Mtimeout -timeout 60 MapiClient -lsql -umonetdb -Pmonetdb
--host=localhost --port=35781 <
prepare-where.SF-1238867.1238959.1238965.1240124.sql
-# 11:51:01 >
+#prepare select * from env() as env where 1 = ?;
+#prepare select * from env() as env where 1 = ?;
+% .prepare, .prepare, .prepare, .prepare, .prepare,
.prepare # table_name
+% type, digits, scale, schema, table, column # name
+% varchar, int, int, str, str, str # type
+% 7, 4, 1, 0, 3, 5 # length
+[ "varchar", 1024, 0, "", "env", "name" ]
+[ "varchar", 2048, 0, "", "env", "value" ]
+[ "tinyint", 8, 0, NULL, NULL, NULL ]
+#prepare select * from env() as env where name in (?);
+#prepare select * from env() as env where name in (?);
+% .prepare, .prepare, .prepare, .prepare, .prepare,
.prepare # table_name
+% type, digits, scale, schema, table, column # name
+% varchar, int, int, str, str, str # type
+% 7, 7, 1, 0, 3, 5 # length
+[ "varchar", 1024, 0, "", "env", "name" ]
+[ "varchar", 2048, 0, "", "env", "value" ]
+[ "varchar", 1024, 0, NULL, NULL, NULL ]
-% .prepare, .prepare, .prepare # table_name
-% type, digits, scale # name
-% varchar, int, int # type
-% 7, 1, 1 # length
-[ "tinyint", 8, 0 ]
-% .prepare, .prepare, .prepare # table_name
-% type, digits, scale # name
-% varchar, int, int # type
-% 7, 4, 1 # length
-[ "varchar", 1024, 0 ]
+# 12:37:36 >
+# 12:37:36 > "Done."
+# 12:37:36 >
-# 13:00:07 >
-# 13:00:07 > Done.
-# 13:00:07 >
-
diff --git
a/sql/test/BugDay_2005-12-19_2.9.3/Tests/prepare_doesnot_like_LIKE.SF-1234205.stable.out
b/sql/test/BugDay_2005-12-19_2.9.3/Tests/prepare_doesnot_like_LIKE.SF-1234205.stable.out
---
a/sql/test/BugDay_2005-12-19_2.9.3/Tests/prepare_doesnot_like_LIKE.SF-1234205.stable.out
+++
b/sql/test/BugDay_2005-12-19_2.9.3/Tests/prepare_doesnot_like_LIKE.SF-1234205.stable.out
@@ -19,11 +19,15 @@ Ready.
# 09:15:18 >
[ 3 ]
-% .prepare, .prepare, .prepare # table_name
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list