1) Improve the handling of the queries like (select ..) union (select ..)
whose first non-space character is '('. 2) Handle Insert .. () VALUES ().
This commit is contained in:
parent
ce7565ab91
commit
7dfc7e9e8c
@ -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++)
|
||||
|
Loading…
Reference in New Issue
Block a user