Changeset: b65ed25ad9fe for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b65ed25ad9fe
Modified Files:
        clients/ChangeLog.Jan2014
        clients/odbc/driver/ODBCUtil.c
Branch: default
Log Message:

Merge with Jan2014 branch.


diffs (64 lines):

diff --git a/clients/ChangeLog.Jan2014 b/clients/ChangeLog.Jan2014
--- a/clients/ChangeLog.Jan2014
+++ b/clients/ChangeLog.Jan2014
@@ -1,3 +1,7 @@
 # ChangeLog file for clients
 # This file is updated with Maddlog
 
+* Tue Apr  1 2014 Sjoerd Mullender <sjo...@acm.org>
+- ODBC: Implemented {call procedure-name(...)} escape.  The version
+  {?=call ...} is not implemented.
+
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
@@ -539,6 +539,49 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL
                        free(nquery);
                        nquery = q;
                        q += n;
+               } else if (strncasecmp(p, "call ", 5) == 0) {
+                       const char *proc, *procend;
+
+                       p += 5;
+                       while (*p == ' ')
+                               p++;
+                       proc = p;
+                       while (*p && isascii(*p) && isalnum(*p))
+                               p++;
+                       if (p == proc ||
+                           (isascii(*proc) && !isalpha(*proc)))
+                               continue;
+                       procend = p;
+                       while (*p == ' ')
+                               p++;
+                       if (*p == '(') {
+                               int nparen = 0;
+                               int q1 = 0, q2 = 0;
+
+                               p++;
+                               while (*p && (*p != ')' || nparen > 0 || q1 || 
q2)) {
+                                       nparen += *p == '(';
+                                       nparen -= *p == ')';
+                                       q1 ^= (*p == '\'') & !q2;
+                                       q2 ^= (*p == '"') & !q1;
+                                       p++;
+                               }
+                               if (*p == 0)
+                                       break;
+                               procend = ++p;
+                               while (*p == ' ')
+                                       p++;
+                       }
+                       if (*p != '}')
+                               break;
+                       p++;
+                       n = (int) (q - nquery);
+                       pr = (int) (p - q);
+                       q = malloc(length - pr + (procend - proc) + 6);
+                       sprintf(q, "%.*scall %.*s%s", n, nquery, (int) (procend 
- proc), proc, p);
+                       free(nquery);
+                       nquery = q;
+                       q += n;
                } else if (p[0] == 'f' && p[1] == 'n' && p[2] == ' ') {
                        const char *scalarfunc;
                        size_t scalarfunclen;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to