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]);
|
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
|
#ifdef MULTIBYTE
|
||||||
#define my_strchr(conn, s1,c1) pg_mbschr(conn->ccsc, s1,c1)
|
#define my_strchr(conn, s1,c1) pg_mbschr(conn->ccsc, s1,c1)
|
||||||
#else
|
#else
|
||||||
@ -1963,7 +1991,7 @@ inner_process_tokens(QueryParse *qp, QueryBuild *qb)
|
|||||||
qb->npos -= qp->declare_pos;
|
qb->npos -= qp->declare_pos;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (qp->token_len == 3)
|
else if (qp->token_len == 3)
|
||||||
{
|
{
|
||||||
int endpos;
|
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)
|
else if (qp->prev_token_end)
|
||||||
|
@ -873,6 +873,11 @@ parse_statement(StatementClass *stmt)
|
|||||||
|
|
||||||
mylog("--------------------------------------------\n");
|
mylog("--------------------------------------------\n");
|
||||||
mylog("nfld=%d, ntab=%d\n", irdflds->nfields, stmt->ntab);
|
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++)
|
for (i = 0; i < (int) irdflds->nfields; i++)
|
||||||
{
|
{
|
||||||
|
@ -439,7 +439,7 @@ statement_type(char *statement)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* ignore leading whitespace in query string */
|
/* ignore leading whitespace in query string */
|
||||||
while (*statement && isspace((unsigned char) *statement))
|
while (*statement && (isspace((unsigned char) *statement) || *statement == '('))
|
||||||
statement++;
|
statement++;
|
||||||
|
|
||||||
for (i = 0; Statement_Type[i].s; i++)
|
for (i = 0; Statement_Type[i].s; i++)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user