提交 7dfc7e9e 编写于 作者: H Hiroshi Inoue

1) Improve the handling of the queries like (select ..) union (select ..)

   whose first non-space character is '('.
2) Handle Insert .. () VALUES ().
上级 ce7565ab
......@@ -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)
......
......@@ -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++)
{
......
......@@ -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++)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册