Changeset: 9b7207bdd349 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9b7207bdd349
Added Files:
        clients/python2/CHANGELOG
        clients/python3/CHANGELOG
        sql/benchmarks/tpch/fileleak/Tests/delete_all.stable.out.Darwin.32bit
        sql/benchmarks/tpch/fileleak/Tests/delete_all.stable.out.Windows
        sql/benchmarks/tpch/fileleak/Tests/delete_all.stable.out.Windows.32bit
        sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out.Darwin.32bit
        sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out.Windows
        sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out.Windows.32.bit
Removed Files:
        clients/python2/test/control.py
        clients/python3/test/control.py
Modified Files:
        MonetDB.spec
        clients/Tests/exports.stable.out
        clients/odbc/driver/ODBCDbc.h
        clients/odbc/driver/ODBCUtil.c
        clients/odbc/driver/ODBCUtil.h
        clients/odbc/driver/SQLExecDirect.c
        clients/odbc/driver/SQLGetInfo.c
        clients/odbc/driver/SQLGetTypeInfo.c
        clients/odbc/driver/SQLNativeSql.c
        clients/odbc/driver/SQLPrepare.c
        clients/python2/monetdb/control.py
        clients/python2/monetdb/mapi.py
        clients/python2/monetdb/sql/connections.py
        clients/python2/test/runtests.py
        clients/python2/test/test_control.py
        clients/python3/monetdb/control.py
        clients/python3/monetdb/mapi.py
        clients/python3/monetdb/sql/connections.py
        clients/python3/test/runtests.py
        clients/python3/test/test_control.py
        gdk/gdk_bbp.c
        monetdb5/optimizer/opt_support.c
        sql/backends/monet5/datacell/receptor.c
        sql/backends/monet5/sql.mx
        sql/backends/monet5/sql_scenario.c
        sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out
        sql/benchmarks/tpch/LOCKED/Tests/01.stable.out
        sql/benchmarks/tpch/LOCKED/Tests/03.stable.out
        sql/benchmarks/tpch/LOCKED/Tests/05.stable.out
        sql/benchmarks/tpch/LOCKED/Tests/06.stable.out
        sql/benchmarks/tpch/LOCKED/Tests/07.stable.out
        sql/benchmarks/tpch/LOCKED/Tests/08.stable.out
        sql/benchmarks/tpch/LOCKED/Tests/09.stable.out
        sql/benchmarks/tpch/LOCKED/Tests/10.stable.out
        sql/benchmarks/tpch/LOCKED/Tests/11.stable.out
        sql/benchmarks/tpch/LOCKED/Tests/14.stable.out
        sql/benchmarks/tpch/LOCKED/Tests/15.stable.out
        sql/benchmarks/tpch/LOCKED/Tests/19.stable.out
        sql/benchmarks/tpch/Tests/01-22.stable.out
        sql/benchmarks/tpch/Tests/01.stable.out
        sql/benchmarks/tpch/Tests/03.stable.out
        sql/benchmarks/tpch/Tests/05.stable.out
        sql/benchmarks/tpch/Tests/06.stable.out
        sql/benchmarks/tpch/Tests/07.stable.out
        sql/benchmarks/tpch/Tests/08.stable.out
        sql/benchmarks/tpch/Tests/09.stable.out
        sql/benchmarks/tpch/Tests/10.stable.out
        sql/benchmarks/tpch/Tests/11.stable.out
        sql/benchmarks/tpch/Tests/14.stable.out
        sql/benchmarks/tpch/Tests/15.stable.out
        sql/benchmarks/tpch/Tests/19.stable.out
        sql/benchmarks/tpch/fileleak/Tests/delete_all.SQL.py
        sql/benchmarks/tpch/fileleak/Tests/leaks.SQL.py
        sql/common/sql_types.c
        sql/server/rel_exp.c
        sql/server/rel_optimizer.c
        sql/server/rel_schema.c
        sql/server/rel_select.c
        sql/server/sql_parser.y
        sql/test/BugTracker-2008/Tests/extract_bug.SF-2075266.stable.out
        sql/test/BugTracker-2008/Tests/mul_div_bug.SF-2075135.stable.out
        
sql/test/BugTracker-2009/Tests/arithmetic-small-values-null.SF-2921310.stable.out
        
sql/test/BugTracker-2010/Tests/group-by_ordered_column.Bug-2564.stable.out.32bit
        sql/test/BugTracker-2011/Tests/and-power.Bug-3013.stable.out
        sql/test/BugTracker-2011/Tests/non-stable-select-bug.Bug-2894.stable.out
        
sql/test/BugTracker-2012/Tests/large-number-operation-strange-results.Bug-2929.stable.out
        sql/test/BugTracker-2012/Tests/power_priority.Bug-2291.stable.out
        sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out.32bit
        
sql/test/BugTracker/Tests/set_sql_debug_64__breaking_the_DB.SF-1906287.stable.out
        sql/test/leaks/Tests/check1.stable.out
        sql/test/leaks/Tests/check1_nogeom.stable.out
        sql/test/leaks/Tests/check2.stable.out
        sql/test/leaks/Tests/check2_nogeom.stable.out
        sql/test/leaks/Tests/check3.stable.out
        sql/test/leaks/Tests/check3_nogeom.stable.out
        sql/test/leaks/Tests/check4.stable.out
        sql/test/leaks/Tests/check4_nogeom.stable.out
        sql/test/leaks/Tests/check5.stable.out
        sql/test/leaks/Tests/check5_nogeom.stable.out
        sql/test/mapi/Tests/php_monetdb.stable.out
        sql/test/mapi/Tests/php_monetdb_nogeom.stable.out
Branch: mutation
Log Message:

Merge with default


diffs (truncated from 3598 to 300 lines):

diff --git a/MonetDB.spec b/MonetDB.spec
--- a/MonetDB.spec
+++ b/MonetDB.spec
@@ -271,6 +271,7 @@ Requires: %{name}-client = %{version}-%{
 Requires: perl
 Requires: perl(DBI)
 Requires: perl(Digest::SHA)
+Requires: perl(Digest::MD5)
 
 %description client-perl
 MonetDB is a database management system that is developed from a
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -2774,6 +2774,7 @@ str mdbTrapClient(Client cntxt, MalBlkPt
 int memoryclaims;
 lng memorypool;
 str mergecandRef;
+str mergepackRef;
 str minRef;
 str min_no_nilRef;
 str minusRef;
diff --git a/clients/odbc/driver/ODBCDbc.h b/clients/odbc/driver/ODBCDbc.h
--- a/clients/odbc/driver/ODBCDbc.h
+++ b/clients/odbc/driver/ODBCDbc.h
@@ -159,4 +159,10 @@ SQLRETURN SQLConnect_(ODBCDbc *dbc, SQLC
 SQLRETURN SQLGetConnectAttr_(ODBCDbc *dbc, SQLINTEGER Attribute, SQLPOINTER 
ValuePtr, SQLINTEGER BufferLength, SQLINTEGER *StringLength);
 SQLRETURN SQLSetConnectAttr_(ODBCDbc *dbc, SQLINTEGER Attribute, SQLPOINTER 
ValuePtr, SQLINTEGER StringLength);
 
+/*
+ * Function to translate an ODBC SQL query to native format.
+ * The return value is a freshly allocated null-terminated string.
+ */
+extern char *ODBCTranslateSQL(ODBCDbc *dbc, const SQLCHAR *query, size_t 
length, SQLUINTEGER noscan);
+
 #endif
diff --git a/clients/odbc/driver/ODBCUtil.c b/clients/odbc/driver/ODBCUtil.c
--- a/clients/odbc/driver/ODBCUtil.c
+++ b/clients/odbc/driver/ODBCUtil.c
@@ -40,6 +40,7 @@
  **********************************************/
 
 #include "ODBCUtil.h"
+#include "ODBCDbc.h"
 #include <float.h>
 
 
@@ -281,11 +282,138 @@ ODBCutf82wchar(const SQLCHAR *s,
   {[?=]call procedure-name[([parameter][,[parameter]]...)]}
  */
 
+static struct scalars {
+       const char *name;
+       int nargs;
+       const char *repl;
+} scalars[] = {
+       {"ascii", 1, "\"ascii\"(\1)", },
+       {"bit_length", 1, NULL, },
+       {"char", 1, NULL, },
+       {"char_length", 1, "\"char_length\"(\1)", },
+       {"character_length", 1, "\"character_length\"(\1)", },
+       {"concat", 2, "\"concat\"(\1,\2)", },
+       {"difference", 2, "\"difference\"(\1,\2)", },
+       {"insert", 4, "\"insert\"(\1,\2,\3,\4)", },
+       {"lcase", 1, "\"lcase\"(\1)", },
+       {"left", 2, "\"left\"(\1,\2)", },
+       {"length", 1, "\"length\"(\1)", },
+       {"locate", 2, "\"locate\"(\1,\2)", },
+       {"locate", 3, "\"locate\"(\1,\2,\3)", },
+       {"ltrim", 1, "\"ltrim\"(\1)", },
+       {"octet_length", 1, "\"octet_length\"(\1)", },
+       {"position", 1, "\"position\"(\1)", }, /* includes "IN" in argument */
+       {"repeat", 2, "\"repeat\"(\1,\2)", },
+       {"replace", 3, "\"replace\"(\1,\2,\3)", },
+       {"right", 2, "\"right\"(\1,\2)", },
+       {"rtrim", 1, "\"rtrim\"(\1)", },
+       {"soundex", 1, "\"soundex\"(\1)", },
+       {"space", 1, "\"space\"(\1)", },
+       {"substring", 3, "\"substring\"(\1,\2,\3)", },
+       {"ucase", 1, "\"ucase\"(\1)", },
+       {"abs", 1, "\"abs\"(\1)", },
+       {"acos", 1, "\"acos\"(\1)", },
+       {"asin", 1, "\"asin\"(\1)", },
+       {"atan", 1, "\"atan\"(\1)", },
+       {"atan2", 2, "\"atan\"(\1,\2)", }, /* note: not atan2 */
+       {"ceiling", 1, "\"ceiling\"(\1)", },
+       {"cos", 1, "\"cos\"(\1)", },
+       {"cot", 1, "\"cot\"(\1)", },
+       {"degrees", 1, "\"sys\".\"degrees\"(\1)", },
+       {"exp", 1, "\"exp\"(\1)", },
+       {"floor", 1, "\"floor\"(\1)", },
+       {"log", 1, "\"log\"(\1)", },
+       {"log10", 1, "\"log10\"(\1)", },
+       {"mod", 2, "\"mod\"(\1,\2)", },
+       {"pi", 0, "\"pi\"()", },
+       {"power", 2, "\"power\"(\1,\2)", },
+       {"radians", 1, "\"sys\".\"radians\"(\1)", },
+       {"rand", 0, "\"rand\"()", },
+       {"rand", 1, "\"rand\"(\1)", },
+       {"round", 2, "\"round\"(\1,\2)", },
+       {"sign", 1, "\"sign\"(\1)", },
+       {"sin", 1, "\"sin\"(\1)", },
+       {"sqrt", 1, "\"sqrt\"(\1)", },
+       {"tan", 1, "\"tan\"(\1)", },
+       {"truncate", 2, "\"truncate\"(\1,\2)", },
+       {"current_date", 0, "\"current_date\"()", },
+       {"current_time", 0, "\"current_time\"()", },
+       {"current_time", 1, NULL, },
+       {"current_timestamp", 0, "\"current_timestamp\"()", },
+       {"current_timestamp", 1, NULL, },
+       {"curdate", 0, "\"curdate\"()", },
+       {"curtime", 0, "\"curtime\"()", },
+       {"dayname", 1, NULL, },
+       {"dayofmonth", 1, "\"dayofmonth\"(\1)", },
+       {"dayofweek", 1, "\"dayofweek\"(\1)", },
+       {"dayofyear", 1, "\"dayofyear\"(\1)", },
+       {"extract", 1, "\"extract\"(\1)", }, /* include "FROM" in argument */
+       {"hour", 1, "\"hour\"(\1)", },
+       {"minute", 1, "\"minute\"(\1)", },
+       {"month", 1, "\"month\"(\1)", },
+       {"monthname", 1, NULL, },
+       {"now", 0, "\"now\"()", },
+       {"quarter", 1, "((\"month\"(\1) - 1) / 3 + 1)", },
+       {"second", 1, "\"second\"(\1)", },
+       {"timestampdiff", 3, NULL, },
+       {"week", 1, "\"week\"(\1)", },
+       {"year", 1, "\"year\"(\1)", },
+       {"database", 0, NULL, },
+       {"ifnull", 2, "\"coalesce\"(\1,\2)", },
+       {"user", 0, NULL, },
+       {"convert", 2, NULL, },
+       {NULL, 0, NULL, },      /* sentinel */
+};
+
+static struct convert {
+       const char *odbc;
+       const char *server;
+} convert[] = {
+       { "SQL_BIGINT", "bigint", },
+       { "SQL_BINARY", "binary large object", },
+       { "SQL_BIT", "boolean", },
+       { "SQL_CHAR", "character large object", },
+       { "SQL_DATE", "date", },
+       { "SQL_DECIMAL", "decimal(18,7)", },
+       { "SQL_DOUBLE", "double", },
+       { "SQL_FLOAT", "float", },
+       /* { "SQL_GUID", "SQL_GUID", }, */
+       { "SQL_INTEGER", "integer", },
+       { "SQL_INTERVAL_DAY", "interval day", },
+       { "SQL_INTERVAL_DAY_TO_HOUR", "interval day to hour", },
+       { "SQL_INTERVAL_DAY_TO_MINUTE", "interval day to minute", },
+       { "SQL_INTERVAL_DAY_TO_SECOND", "interval day to second", },
+       { "SQL_INTERVAL_HOUR", "interval hour", },
+       { "SQL_INTERVAL_HOUR_TO_MINUTE", "interval hour to minute", },
+       { "SQL_INTERVAL_HOUR_TO_SECOND", "interval hour to second", },
+       { "SQL_INTERVAL_MINUTE", "interval minute", },
+       { "SQL_INTERVAL_MINUTE_TO_SECOND", "interval minute to second", },
+       { "SQL_INTERVAL_MONTH", "interval month", },
+       { "SQL_INTERVAL_SECOND", "interval second", },
+       { "SQL_INTERVAL_YEAR", "interval year", },
+       { "SQL_INTERVAL_YEAR_TO_MONTH", "interval year to month", },
+       { "SQL_LONGVARBINARY", "binary large object", },
+       { "SQL_LONGVARCHAR", "character large object", },
+       { "SQL_NUMERIC", "numeric(18,7)", },
+       { "SQL_REAL", "real", },
+       { "SQL_SMALLINT", "smallint", },
+       { "SQL_TIME", "time", },
+       { "SQL_TIMESTAMP", "timestamp", },
+       { "SQL_TINYINT", "tinyint", },
+       { "SQL_VARBINARY", "binary large object", },
+       { "SQL_VARCHAR", "character large object", },
+       { "SQL_WCHAR", "character", },
+       { "SQL_WLONGVARCHAR", "character large object", },
+       { "SQL_WVARCHAR", "character large object", },
+       { NULL, NULL, },        /* sentinel */
+};
+
 char *
-ODBCTranslateSQL(const SQLCHAR *query, size_t length, SQLUINTEGER noscan)
+ODBCTranslateSQL(ODBCDbc *dbc, const SQLCHAR *query, size_t length, 
SQLUINTEGER noscan)
 {
        char *nquery;
-       char *p, *q;
+       const char *p;
+       char *q;
        char buf[512];
        unsigned yr, mt, dy, hr, mn, sc;
        unsigned long fr = 0;
@@ -384,7 +512,6 @@ ODBCTranslateSQL(const SQLCHAR *query, s
                        if (*p != '}')
                                continue;
                        p++;
-                       pr = 0;
                        snprintf(buf, sizeof(buf),
                                 "DATE '%04u-%02u-%02u'", yr, mt, dy);
                        n = (int) (q - nquery);
@@ -394,6 +521,156 @@ ODBCTranslateSQL(const SQLCHAR *query, s
                        free(nquery);
                        nquery = q;
                        q += n;
+               } else if (strncasecmp(p, "interval", 8) == 0 && p[8] == ' ') {
+                       const char *intv = p;
+                       size_t intvl;
+
+                       p = strchr(p, '}');
+                       if (p == NULL)
+                               continue;
+                       intvl = p - intv;
+                       while (intv[intvl - 1] == ' ')
+                               intvl--;
+                       p++;
+                       n = (int) (q - nquery);
+                       pr = (int) (p - q);
+                       q = malloc(length - pr + intvl + 1);
+                       sprintf(q, "%.*s%.*s%s", n, nquery, (int) intvl, intv, 
p);
+                       free(nquery);
+                       nquery = q;
+                       q += n;
+               } else if (p[0] == 'f' && p[1] == 'n' && p[2] == ' ') {
+                       const char *scalarfunc;
+                       size_t scalarfunclen;
+                       struct arg {
+                               const char *argstart;
+                               size_t arglen;
+                       } args[4];
+                       int nargs;
+                       struct scalars *func;
+
+                       p += 3;
+                       while (*p == ' ')
+                               p++;
+                       scalarfunc = p;
+                       while (*p && isascii(*p) && isalnum(*p))
+                               p++;
+                       if (p == scalarfunc ||
+                           (isascii(*scalarfunc) && !isalpha(*scalarfunc)))
+                               continue;
+                       scalarfunclen = p - scalarfunc;
+                       while (*p == ' ')
+                               p++;
+                       if (*p++ != '(')
+                               continue;
+                       while (*p == ' ')
+                               p++;
+                       nargs = 0;
+                       while (*p && *p != ')') {
+                               int nparen = 0;
+
+                               if (nargs == 4) {
+                                       /* too many args to be matched */
+                                       break;
+                               }
+                               args[nargs].argstart = p;
+                               while (*p &&
+                                      (nparen != 0 ||
+                                       (*p != ')' && *p != ','))) {
+                                       if (*p == '"') {
+                                               while (*++p && *p != '"')
+                                                       ;
+                                               if (*p)
+                                                       p++;
+                                       } else if (*p == '\'') {
+                                               while (*++p && *p != '\'')
+                                                       if (*p == '\\' &&
+                                                           *++p == 0)
+                                                               break;
+                                               if (*p)
+                                                       p++;
+                                       } else {
+                                               if (*p == '(')
+                                                       nparen++;
+                                               else if (*p == ')')
+                                                       nparen--;
+                                               p++;
+                                       }
+                               }
+                               args[nargs].arglen = p - args[nargs].argstart;
+                               while (args[nargs].argstart[args[nargs].arglen 
- 1] == ' ')
+                                       args[nargs].arglen--;
+                               if (*p == ',') {
+                                       p++;
+                                       while (*p == ' ')
+                                               p++;
+                               }
+                               nargs++;
+                       }
+                       if (*p != ')')
+                               continue;
+                       while (*++p && *p == ' ')
+                               ;
+                       if (*p != '}')
+                               continue;
+                       p++;
+                       n = (int) (q - nquery);
+                       pr = (int) (p - q);
+                       for (func = scalars; func->name; func++) {
+                               if (strncasecmp(func->name, scalarfunc, 
scalarfunclen) == 0 && func->name[scalarfunclen] == 0 && func->nargs == nargs) {
+                                       if (func->repl) {
+                                               const char *r;
+                                               q = malloc(length - pr + 
strlen(func->repl) - nargs + (nargs > 0 ? args[0].arglen : 0) + (nargs > 1 ? 
args[1].arglen : 0) + (nargs > 2 ? args[2].arglen : 0) + 1);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to