aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/odbc/convert.c44
-rw-r--r--src/interfaces/odbc/parse.c5
-rw-r--r--src/interfaces/odbc/statement.c2
3 files changed, 49 insertions, 2 deletions
diff --git a/src/interfaces/odbc/convert.c b/src/interfaces/odbc/convert.c
index 15a1a23c737..2b586192320 100644
--- a/src/interfaces/odbc/convert.c
+++ b/src/interfaces/odbc/convert.c
@@ -1622,6 +1622,34 @@ table_for_update(const char *stmt, int *endpos)
return !wstmt[0] || isspace((unsigned char) wstmt[0]);
}
+/*----------
+ * Check if the statement is
+ * INSERT INTO ... () VALUES ()
+ * This isn't really a strict check but ...
+ *----------
+ */
+static BOOL
+insert_without_target(const char *stmt, int *endpos)
+{
+ const char *wstmt = stmt;
+
+ while (isspace((unsigned char) *(++wstmt)));
+ if (!*wstmt)
+ return FALSE;
+ if (strnicmp(wstmt, "VALUES", 6))
+ return FALSE;
+ wstmt += 6;
+ if (!wstmt[0] || !isspace((unsigned char) wstmt[0]))
+ return FALSE;
+ while (isspace((unsigned char) *(++wstmt)));
+ if (*wstmt != '(' || *(++wstmt) != ')')
+ return FALSE;
+ wstmt++;
+ *endpos = wstmt - stmt;
+ return !wstmt[0] || isspace((unsigned char) wstmt[0])
+ || ';' == wstmt[0];
+}
+
#ifdef MULTIBYTE
#define my_strchr(conn, s1,c1) pg_mbschr(conn->ccsc, s1,c1)
#else
@@ -1963,7 +1991,7 @@ inner_process_tokens(QueryParse *qp, QueryBuild *qb)
qb->npos -= qp->declare_pos;
}
}
- if (qp->token_len == 3)
+ else if (qp->token_len == 3)
{
int endpos;
@@ -1985,6 +2013,20 @@ inner_process_tokens(QueryParse *qp, QueryBuild *qb)
}
}
}
+ else if (qp->token_len == 2)
+ {
+ int endpos;
+
+ if (STMT_TYPE_INSERT == qp->statement_type &&
+ strnicmp(qp->token_save, "()", 2) == 0 &&
+ insert_without_target(&qp->statement[qp->opos], &endpos))
+ {
+ qb->npos -= 2;
+ CVT_APPEND_STR(qb, "DEFAULT VALUES");
+ qp->opos += endpos;
+ return SQL_SUCCESS;
+ }
+ }
}
}
else if (qp->prev_token_end)
diff --git a/src/interfaces/odbc/parse.c b/src/interfaces/odbc/parse.c
index b2661d5379d..a61b75e90cf 100644
--- a/src/interfaces/odbc/parse.c
+++ b/src/interfaces/odbc/parse.c
@@ -873,6 +873,11 @@ parse_statement(StatementClass *stmt)
mylog("--------------------------------------------\n");
mylog("nfld=%d, ntab=%d\n", irdflds->nfields, stmt->ntab);
+ if (0 == stmt->ntab)
+ {
+ stmt->parse_status = STMT_PARSE_FATAL;
+ return FALSE;
+ }
for (i = 0; i < (int) irdflds->nfields; i++)
{
diff --git a/src/interfaces/odbc/statement.c b/src/interfaces/odbc/statement.c
index 391eb73bcbc..66dbb0a41d5 100644
--- a/src/interfaces/odbc/statement.c
+++ b/src/interfaces/odbc/statement.c
@@ -439,7 +439,7 @@ statement_type(char *statement)
int i;
/* ignore leading whitespace in query string */
- while (*statement && isspace((unsigned char) *statement))
+ while (*statement && (isspace((unsigned char) *statement) || *statement == '('))
statement++;
for (i = 0; Statement_Type[i].s; i++)