Changeset: b45ce4b9ba25 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b45ce4b9ba25
Added Files:
        clients/odbc/samples/testStmtAttr.c
Modified Files:
        MonetDB.spec
        clients/odbc/samples/Makefile.ag
        clients/odbc/samples/arraytest.c
        clients/odbc/samples/odbcsample1.c
        clients/odbc/samples/testgetinfo.c
        gdk/gdk.h
        monetdb5/modules/atoms/json.c
        monetdb5/modules/mal/mkey.c
        monetdb5/modules/mal/wlc.c
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/wlr.c
        sql/server/rel_planner.c
        sql/server/rel_semantic.c
        sql/server/rel_updates.c
        sql/server/sql_privileges.c
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-cast-null-add.Bug-6630.sql
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-cast-null-add.Bug-6630.stable.out
Branch: default
Log Message:

Merge with Mar2018 branch.


diffs (truncated from 922 to 300 lines):

diff --git a/MonetDB.spec b/MonetDB.spec
--- a/MonetDB.spec
+++ b/MonetDB.spec
@@ -434,6 +434,7 @@ developer.
 %{_bindir}/smack01
 %{_bindir}/shutdowntest
 %{_bindir}/testgetinfo
+%{_bindir}/testStmtAttr
 %{_bindir}/malsample.pl
 %{_bindir}/sqlsample.php
 %{_bindir}/sqlsample.pl
diff --git a/clients/odbc/samples/Makefile.ag b/clients/odbc/samples/Makefile.ag
--- a/clients/odbc/samples/Makefile.ag
+++ b/clients/odbc/samples/Makefile.ag
@@ -11,6 +11,6 @@ INCLUDES = $(ODBC_INCS)
 BINS = {
        CONDINST = HAVE_TESTING
        DIR = libdir/monetdb/tests
-       SOURCES = odbcsample1.c testgetinfo.c arraytest.c
+       SOURCES = odbcsample1.c testgetinfo.c arraytest.c testStmtAttr.c
        LIBS = $(ODBC_LIBS)
 }
diff --git a/clients/odbc/samples/arraytest.c b/clients/odbc/samples/arraytest.c
--- a/clients/odbc/samples/arraytest.c
+++ b/clients/odbc/samples/arraytest.c
@@ -53,9 +53,6 @@ prerr(SQLSMALLINT tpe, SQLHANDLE hnd, co
                        func, pref);
                break;
        case SQL_NO_DATA:
-               fprintf(stderr,
-                       "%s: %s, no error message from driver\n",
-                       func, pref);
                break;
        default:
                fprintf(stderr,
@@ -76,7 +73,7 @@ check(SQLRETURN ret, SQLSMALLINT tpe, SQ
                break;
        case SQL_ERROR:
                prerr(tpe, hnd, func, "Error");
-               exit(1);
+               break;
        case SQL_INVALID_HANDLE:
                fprintf(stderr, "%s: Error: invalid handle\n", func);
                exit(1);
@@ -371,16 +368,16 @@ main(int argc, char **argv)
        }
 
        ret = SQLFreeHandle(SQL_HANDLE_STMT, stmt);
-       check(ret, SQL_HANDLE_STMT, stmt, "SQLFreeHandle 2");
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLFreeHandle (STMT)");
 
        ret = SQLDisconnect(dbc);
        check(ret, SQL_HANDLE_DBC, dbc, "SQLDisconnect");
 
        ret = SQLFreeHandle(SQL_HANDLE_DBC, dbc);
-       check(ret, SQL_HANDLE_DBC, dbc, "SQLFreeHandle 3");
+       check(ret, SQL_HANDLE_DBC, dbc, "SQLFreeHandle (DBC)");
 
        ret = SQLFreeHandle(SQL_HANDLE_ENV, env);
-       check(ret, SQL_HANDLE_STMT, stmt, "SQLFreeHandle 4");
+       check(ret, SQL_HANDLE_ENV, env, "SQLFreeHandle (ENV)");
 
        return 0;
 }
diff --git a/clients/odbc/samples/odbcsample1.c 
b/clients/odbc/samples/odbcsample1.c
--- a/clients/odbc/samples/odbcsample1.c
+++ b/clients/odbc/samples/odbcsample1.c
@@ -45,7 +45,6 @@ prerr(SQLSMALLINT tpe, SQLHANDLE hnd, co
                fprintf(stderr, "%s: %s, unexpected error from 
SQLGetDiagRec\n", func, pref);
                break;
        case SQL_NO_DATA:
-               fprintf(stderr, "%s: %s, no error message from driver\n", func, 
pref);
                break;
        default:
                fprintf(stderr, "%s: %s, weird return value from 
SQLGetDiagRec\n", func, pref);
@@ -64,7 +63,7 @@ check(SQLRETURN ret, SQLSMALLINT tpe, SQ
                break;
        case SQL_ERROR:
                prerr(tpe, hnd, func, "Error");
-               exit(1);
+               break;
        case SQL_INVALID_HANDLE:
                fprintf(stderr, "%s: Error: invalid handle\n", func);
                exit(1);
@@ -111,7 +110,7 @@ main(int argc, char **argv)
        check(ret, SQL_HANDLE_ENV, env, "SQLSetEnvAttr");
 
        ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
-       check(ret, SQL_HANDLE_ENV, env, "SQLAllocHandle 1");
+       check(ret, SQL_HANDLE_ENV, env, "SQLAllocHandle (DBC)");
 
        ret = SQLConnect(dbc, (SQLCHAR *) dsn, SQL_NTS, (SQLCHAR *) user, 
SQL_NTS, (SQLCHAR *) pass, SQL_NTS);
        check(ret, SQL_HANDLE_DBC, dbc, "SQLConnect");
@@ -121,8 +120,7 @@ main(int argc, char **argv)
 
        /* create a test table to be filled with values */
        ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
-
-       check(ret, SQL_HANDLE_DBC, dbc, "SQLAllocHandle 2");
+       check(ret, SQL_HANDLE_DBC, dbc, "SQLAllocHandle (STMT 1)");
 
        ret = SQLExecDirect(stmt, (SQLCHAR *)
                            "CREATE TABLE odbcsampletest (\n"
@@ -259,7 +257,7 @@ main(int argc, char **argv)
 
        /* now the handle for the odd entries */
        ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt2);
-       check(ret, SQL_HANDLE_DBC, dbc, "SQLAllocHandle 3");
+       check(ret, SQL_HANDLE_DBC, dbc, "SQLAllocHandle (STMT 2)");
 
        ret = SQLPrepare(stmt2, (SQLCHAR *) "SELECT * FROM odbcsampletest WHERE 
2*(i/2) <> i", SQL_NTS);
        check(ret, SQL_HANDLE_STMT, stmt2, "SQLPrepare 3");
@@ -304,23 +302,23 @@ main(int argc, char **argv)
 
        /* cleanup and disconnect */
        ret = SQLFreeHandle(SQL_HANDLE_STMT, stmt2);
-       check(ret, SQL_HANDLE_STMT, stmt2, "SQLFreeHandle 1");
+       check(ret, SQL_HANDLE_STMT, stmt2, "SQLFreeHandle (STMT 2)");
 
        /* drop the test table */
        ret = SQLExecDirect(stmt, (SQLCHAR *) "DROP TABLE odbcsampletest", 
SQL_NTS);
        check(ret, SQL_HANDLE_STMT, stmt, "SQLExecDirect 3");
 
        ret = SQLFreeHandle(SQL_HANDLE_STMT, stmt);
-       check(ret, SQL_HANDLE_STMT, stmt, "SQLFreeHandle 2");
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLFreeHandle (STMT 1)");
 
        ret = SQLDisconnect(dbc);
        check(ret, SQL_HANDLE_DBC, dbc, "SQLDisconnect");
 
        ret = SQLFreeHandle(SQL_HANDLE_DBC, dbc);
-       check(ret, SQL_HANDLE_DBC, dbc, "SQLFreeHandle 3");
+       check(ret, SQL_HANDLE_DBC, dbc, "SQLFreeHandle (DBC)");
 
        ret = SQLFreeHandle(SQL_HANDLE_ENV, env);
-       check(ret, SQL_HANDLE_STMT, stmt, "SQLFreeHandle 4");
+       check(ret, SQL_HANDLE_ENV, env, "SQLFreeHandle (ENV)");
 
        return 0;
 }
diff --git a/clients/odbc/samples/testStmtAttr.c 
b/clients/odbc/samples/testStmtAttr.c
new file mode 100644
--- /dev/null
+++ b/clients/odbc/samples/testStmtAttr.c
@@ -0,0 +1,171 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0.  If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 1997 - July 2008 CWI, August 2008 - 2018 MonetDB B.V.
+ */
+
+#ifdef _MSC_VER
+#include <WTypes.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <sql.h>
+#include <sqlext.h>
+
+#ifdef _MSC_VER
+#define snprintf _snprintf
+#endif
+
+static void
+prerr(SQLSMALLINT tpe, SQLHANDLE hnd, const char *func, const char *pref)
+{
+       SQLCHAR state[6];
+       SQLINTEGER errnr;
+       SQLCHAR msg[256];
+       SQLSMALLINT msglen;
+       SQLRETURN ret;
+
+       ret = SQLGetDiagRec(tpe, hnd, 1, state, &errnr, msg, sizeof(msg), 
&msglen);
+       switch (ret) {
+       case SQL_SUCCESS_WITH_INFO:
+               if (msglen >= (signed int) sizeof(msg))
+                       fprintf(stderr, "(message truncated)\n");
+               /* fall through */
+       case SQL_SUCCESS:
+               fprintf(stderr, "%s: %s: SQLstate %s, Errnr %d, Message %s\n", 
func, pref, (char*)state, (int)errnr, (char*)msg);
+               break;
+       case SQL_INVALID_HANDLE:
+               fprintf(stderr, "%s: %s, invalid handle passed to error 
function\n", func, pref);
+               break;
+       case SQL_ERROR:
+               fprintf(stderr, "%s: %s, unexpected error from 
SQLGetDiagRec\n", func, pref);
+               break;
+       case SQL_NO_DATA:
+               break;
+       default:
+               fprintf(stderr, "%s: %s, weird return value from 
SQLGetDiagRec\n", func, pref);
+               break;
+       }
+}
+
+static void
+check(SQLRETURN ret, SQLSMALLINT tpe, SQLHANDLE hnd, const char *func)
+{
+       switch (ret) {
+       case SQL_SUCCESS:
+               break;
+       case SQL_SUCCESS_WITH_INFO:
+               prerr(tpe, hnd, func, "Info");
+               break;
+       case SQL_ERROR:
+               prerr(tpe, hnd, func, "Error");
+               break;
+       case SQL_INVALID_HANDLE:
+               fprintf(stderr, "%s: Error: invalid handle\n", func);
+               exit(1);
+       default:
+               fprintf(stderr, "%s: Unexpected return value\n", func);
+               break;
+       }
+}
+
+static void
+GetSetReGetStmtAttr(SQLHANDLE stmt, SQLINTEGER attribute, const char * 
attr_name, SQLULEN value)
+{
+       SQLRETURN ret;
+       SQLULEN ul;
+       SQLINTEGER resultlen;
+
+       // first get the actual value from the server
+       ret = SQLGetStmtAttr(stmt, attribute, &ul, sizeof(ul), &resultlen);
+       fprintf(stderr, "Get %s: %lu\n", attr_name, (long unsigned int) ul);
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLGetStmtAttr");
+
+       // next change the value on the server
+       ret = SQLSetStmtAttr(stmt, attribute, &value, 0);
+       fprintf(stderr, "Set %s: %lu\n", attr_name, (long unsigned int) value);
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLSetStmtAttr");
+
+       // next re-get the value from the server, should be the same as the set 
value
+       ul = 123456789;
+       ret = SQLGetStmtAttr(stmt, attribute, &ul, sizeof(ul), &resultlen);
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLGetStmtAttr");
+       fprintf(stderr, "Get changed %s: %lu", attr_name, (long unsigned int) 
ul);
+       if (ul != value)
+               fprintf(stderr, " which is different from %lu !!", (long 
unsigned int) value);
+       fprintf(stderr, "\n\n");
+}
+
+int
+main(int argc, char **argv)
+{
+       SQLRETURN ret;
+       SQLHANDLE env;
+       SQLHANDLE dbc;
+       SQLHANDLE stmt;
+       char *dsn = "MonetDB";
+       char *user = "monetdb";
+       char *pass = "monetdb";
+
+       if (argc > 1)
+               dsn = argv[1];
+       if (argc > 2)
+               user = argv[2];
+       if (argc > 3)
+               pass = argv[3];
+       if (argc > 4 || *dsn == '-') {
+               fprintf(stderr, "Usage: %s [datasource [user [password]]]\n", 
argv[0]);
+               exit(1);
+       }
+
+       ret = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &env);
+       if (ret != SQL_SUCCESS) {
+               fprintf(stderr, "Cannot allocate ODBC environment handle!\n");
+               exit(1);
+       }
+
+       ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) 
(uintptr_t) SQL_OV_ODBC3, 0);
+       check(ret, SQL_HANDLE_ENV, env, "SQLSetEnvAttr (SQL_ATTR_ODBC_VERSION 
ODBC3)");
+
+       ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
+       check(ret, SQL_HANDLE_ENV, env, "SQLAllocHandle (DBC)");
+
+       ret = SQLConnect(dbc, (SQLCHAR *) dsn, SQL_NTS, (SQLCHAR *) user, 
SQL_NTS, (SQLCHAR *) pass, SQL_NTS);
+       check(ret, SQL_HANDLE_DBC, dbc, "SQLConnect");
+
+       ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
+       check(ret, SQL_HANDLE_DBC, dbc, "SQLAllocHandle (STMT)");
+
+       /* run actual tests */
+       GetSetReGetStmtAttr(stmt, SQL_ATTR_QUERY_TIMEOUT, 
"SQL_ATTR_QUERY_TIMEOUT", -1);        /* test also what happens with a negative 
value */
+       GetSetReGetStmtAttr(stmt, SQL_ATTR_QUERY_TIMEOUT, 
"SQL_ATTR_QUERY_TIMEOUT", 0);
+       GetSetReGetStmtAttr(stmt, SQL_ATTR_QUERY_TIMEOUT, 
"SQL_ATTR_QUERY_TIMEOUT", 3600);
+       GetSetReGetStmtAttr(stmt, SQL_ATTR_QUERY_TIMEOUT, 
"SQL_ATTR_QUERY_TIMEOUT", 2147483647);
+
+       GetSetReGetStmtAttr(stmt, SQL_ATTR_MAX_LENGTH, "SQL_ATTR_MAX_LENGTH", 
-2);      /* test also what happens with a negative value */
+       GetSetReGetStmtAttr(stmt, SQL_ATTR_MAX_LENGTH, "SQL_ATTR_MAX_LENGTH", 
0);
+       GetSetReGetStmtAttr(stmt, SQL_ATTR_MAX_LENGTH, "SQL_ATTR_MAX_LENGTH", 
65535);
+       GetSetReGetStmtAttr(stmt, SQL_ATTR_MAX_LENGTH, "SQL_ATTR_MAX_LENGTH", 
2147483647);
+
+       GetSetReGetStmtAttr(stmt, SQL_ATTR_MAX_ROWS, "SQL_ATTR_MAX_ROWS", -3);  
/* test also what happens with a negative value */
+       GetSetReGetStmtAttr(stmt, SQL_ATTR_MAX_ROWS, "SQL_ATTR_MAX_ROWS", 0);
+       GetSetReGetStmtAttr(stmt, SQL_ATTR_MAX_ROWS, "SQL_ATTR_MAX_ROWS", 
100000);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to