MXS-1196: Add support for [SHOW] CREATE SEQUENCE
This commit is contained in:
@ -156,7 +156,7 @@ static bool ensure_query_is_parsed(GWBUF* query);
|
|||||||
static bool parse_query(GWBUF* querybuf);
|
static bool parse_query(GWBUF* querybuf);
|
||||||
static bool query_is_parsed(GWBUF* buf);
|
static bool query_is_parsed(GWBUF* buf);
|
||||||
|
|
||||||
#if MYSQL_VERSION_MINOR >= 3
|
#if MYSQL_VERSION_MAJOR >= 10 && MYSQL_VERSION_MINOR >= 3
|
||||||
inline void get_string_and_length(const LEX_CSTRING& ls, const char** s, size_t* length)
|
inline void get_string_and_length(const LEX_CSTRING& ls, const char** s, size_t* length)
|
||||||
{
|
{
|
||||||
*s = ls.str;
|
*s = ls.str;
|
||||||
@ -1812,6 +1812,9 @@ int32_t qc_mysql_get_operation(GWBUF* querybuf, int32_t* operation)
|
|||||||
case SQLCOM_CREATE_FUNCTION:
|
case SQLCOM_CREATE_FUNCTION:
|
||||||
case SQLCOM_CREATE_INDEX:
|
case SQLCOM_CREATE_INDEX:
|
||||||
case SQLCOM_CREATE_PROCEDURE:
|
case SQLCOM_CREATE_PROCEDURE:
|
||||||
|
#if MYSQL_VERSION_MAJOR >= 10 && MYSQL_VERSION_MINOR >= 3
|
||||||
|
case SQLCOM_CREATE_SEQUENCE:
|
||||||
|
#endif
|
||||||
case SQLCOM_CREATE_SERVER:
|
case SQLCOM_CREATE_SERVER:
|
||||||
case SQLCOM_CREATE_SPFUNCTION:
|
case SQLCOM_CREATE_SPFUNCTION:
|
||||||
case SQLCOM_CREATE_TABLE:
|
case SQLCOM_CREATE_TABLE:
|
||||||
|
@ -2058,6 +2058,33 @@ void maxscaleCheckTable(Parse* pParse, SrcList* pTables)
|
|||||||
exposed_sqlite3SrcListDelete(pParse->db, pTables);
|
exposed_sqlite3SrcListDelete(pParse->db, pTables);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void maxscaleCreateSequence(Parse* pParse, Token* pDatabase, Token* pTable)
|
||||||
|
{
|
||||||
|
QC_TRACE();
|
||||||
|
|
||||||
|
QC_SQLITE_INFO* info = this_thread.info;
|
||||||
|
ss_dassert(info);
|
||||||
|
|
||||||
|
info->status = QC_QUERY_PARSED;
|
||||||
|
|
||||||
|
const char* zDatabase = NULL;
|
||||||
|
char database[pDatabase ? pDatabase->n + 1 : 1];
|
||||||
|
|
||||||
|
if (pDatabase)
|
||||||
|
{
|
||||||
|
strncpy(database, pDatabase->z, pDatabase->n);
|
||||||
|
database[pDatabase->n] = 0;
|
||||||
|
|
||||||
|
zDatabase = database;
|
||||||
|
}
|
||||||
|
|
||||||
|
char table[pTable->n + 1];
|
||||||
|
strncpy(table, pTable->z, pTable->n);
|
||||||
|
table[pTable->n] = 0;
|
||||||
|
|
||||||
|
update_names(info, zDatabase, table);
|
||||||
|
}
|
||||||
|
|
||||||
void maxscaleComment()
|
void maxscaleComment()
|
||||||
{
|
{
|
||||||
QC_TRACE();
|
QC_TRACE();
|
||||||
@ -2933,6 +2960,10 @@ extern void maxscaleShow(Parse* pParse, MxsShow* pShow)
|
|||||||
info->type_mask = QUERY_TYPE_READ;
|
info->type_mask = QUERY_TYPE_READ;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MXS_SHOW_CREATE_SEQUENCE:
|
||||||
|
info->type_mask = QUERY_TYPE_READ;
|
||||||
|
break;
|
||||||
|
|
||||||
case MXS_SHOW_CREATE_VIEW:
|
case MXS_SHOW_CREATE_VIEW:
|
||||||
info->type_mask = QUERY_TYPE_READ;
|
info->type_mask = QUERY_TYPE_READ;
|
||||||
break;
|
break;
|
||||||
|
@ -110,6 +110,7 @@ extern void maxscaleCollectInfoFromSelect(Parse*, Select*, int);
|
|||||||
extern void maxscaleAlterTable(Parse*, mxs_alter_t command, SrcList*, Token*);
|
extern void maxscaleAlterTable(Parse*, mxs_alter_t command, SrcList*, Token*);
|
||||||
extern void maxscaleCall(Parse*, SrcList* pName, int uses_variables);
|
extern void maxscaleCall(Parse*, SrcList* pName, int uses_variables);
|
||||||
extern void maxscaleCheckTable(Parse*, SrcList* pTables);
|
extern void maxscaleCheckTable(Parse*, SrcList* pTables);
|
||||||
|
extern void maxscaleCreateSequence(Parse*, Token* pDatabase, Token* pTable);
|
||||||
extern void maxscaleDeallocate(Parse*, Token* pName);
|
extern void maxscaleDeallocate(Parse*, Token* pName);
|
||||||
extern void maxscaleDo(Parse*, ExprList* pEList);
|
extern void maxscaleDo(Parse*, ExprList* pEList);
|
||||||
extern void maxscaleDrop(Parse*, MxsDrop* pDrop);
|
extern void maxscaleDrop(Parse*, MxsDrop* pDrop);
|
||||||
@ -600,7 +601,7 @@ columnid(A) ::= nm(X). {
|
|||||||
OF OFFSET OPEN
|
OF OFFSET OPEN
|
||||||
QUICK
|
QUICK
|
||||||
RAISE RECURSIVE /*REINDEX*/ RELEASE /*RENAME*/ /*REPLACE*/ RESTRICT ROLLBACK ROLLUP ROW
|
RAISE RECURSIVE /*REINDEX*/ RELEASE /*RENAME*/ /*REPLACE*/ RESTRICT ROLLBACK ROLLUP ROW
|
||||||
SAVEPOINT SELECT_OPTIONS_KW SLAVE /*START*/ STATUS
|
SAVEPOINT SELECT_OPTIONS_KW /*SEQUENCE*/ SLAVE /*START*/ STATUS
|
||||||
TABLES TEMP TEMPTABLE /*TRIGGER*/
|
TABLES TEMP TEMPTABLE /*TRIGGER*/
|
||||||
/*TRUNCATE*/
|
/*TRUNCATE*/
|
||||||
// TODO: UNSIGNED is a reserved word and should not automatically convert into an identifer.
|
// TODO: UNSIGNED is a reserved word and should not automatically convert into an identifer.
|
||||||
@ -1771,11 +1772,6 @@ term(A) ::= DEFAULT(X). {spanExpr(&A, pParse, @X, &X);}
|
|||||||
%endif
|
%endif
|
||||||
term(A) ::= NULL(X). {spanExpr(&A, pParse, @X, &X);}
|
term(A) ::= NULL(X). {spanExpr(&A, pParse, @X, &X);}
|
||||||
expr(A) ::= id(X). {spanExpr(&A, pParse, TK_ID, &X);}
|
expr(A) ::= id(X). {spanExpr(&A, pParse, TK_ID, &X);}
|
||||||
expr(A) ::= JOIN_KW(X). {spanExpr(&A, pParse, TK_ID, &X);}
|
|
||||||
expr(A) ::= START(X). {spanExpr(&A, pParse, TK_ID, &X);}
|
|
||||||
expr(A) ::= TRUNCATE(X). {spanExpr(&A, pParse, TK_ID, &X);}
|
|
||||||
expr(A) ::= BEGIN(X). {spanExpr(&A, pParse, TK_ID, &X);}
|
|
||||||
expr(A) ::= REPLACE(X). {spanExpr(&A, pParse, TK_ID, &X);}
|
|
||||||
expr(A) ::= nm(X) DOT nm(Y). {
|
expr(A) ::= nm(X) DOT nm(Y). {
|
||||||
Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
|
Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
|
||||||
Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y);
|
Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y);
|
||||||
@ -3118,6 +3114,19 @@ show(A) ::= SHOW CREATE VIEW nm(X) dbnm(Y). {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
show(A) ::= SHOW CREATE SEQUENCE nm(X) dbnm(Y). {
|
||||||
|
A.what = MXS_SHOW_CREATE_SEQUENCE;
|
||||||
|
A.data = 0;
|
||||||
|
if (Y.z) {
|
||||||
|
A.pName = &Y;
|
||||||
|
A.pDatabase = &X;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
A.pName = &X;
|
||||||
|
A.pDatabase = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
show(A) ::= SHOW DATABASES_KW like_or_where_opt. {
|
show(A) ::= SHOW DATABASES_KW like_or_where_opt. {
|
||||||
A.what = MXS_SHOW_DATABASES;
|
A.what = MXS_SHOW_DATABASES;
|
||||||
A.data = 0;
|
A.data = 0;
|
||||||
@ -3269,15 +3278,31 @@ cmd ::= TRUNCATE table_opt nm(X) dbnm(Y). {
|
|||||||
maxscaleTruncate(pParse, pDatabase, pName);
|
maxscaleTruncate(pParse, pDatabase, pName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////// ORACLE ////////////////////////////////////
|
//////////////////////// ORACLE Assignment ////////////////////////////////////
|
||||||
//
|
//
|
||||||
//ecmd ::= oracle_assignment SEMI.
|
oracle_assignment ::= id(X) EQ expr(Y). {
|
||||||
//cmd ::= oracle_assignment.
|
|
||||||
oracle_assignment ::= ID(X) EQ expr(Y). {
|
|
||||||
Expr* pX = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
|
Expr* pX = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
|
||||||
Expr* pExpr = sqlite3PExpr(pParse, TK_EQ, pX, Y.pExpr, 0);
|
Expr* pExpr = sqlite3PExpr(pParse, TK_EQ, pX, Y.pExpr, 0);
|
||||||
ExprList* pExprList = sqlite3ExprListAppend(pParse, 0, pExpr);
|
ExprList* pExprList = sqlite3ExprListAppend(pParse, 0, pExpr);
|
||||||
maxscaleSet(pParse, 0, MXS_SET_VARIABLES, pExprList);
|
maxscaleSet(pParse, 0, MXS_SET_VARIABLES, pExprList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//////////////////////// ORACLE CREATE SEQUENCE ////////////////////////////////////
|
||||||
|
//
|
||||||
|
cmd ::= CREATE SEQUENCE nm(X) dbnm(Y).{ // CREATE SEQUENCE db
|
||||||
|
Token* pDatabase;
|
||||||
|
Token* pTable;
|
||||||
|
if (Y.z)
|
||||||
|
{
|
||||||
|
pDatabase = &X;
|
||||||
|
pTable = &Y;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pDatabase = NULL;
|
||||||
|
pTable = &X;
|
||||||
|
}
|
||||||
|
maxscaleCreateSequence(pParse, pDatabase, pTable);
|
||||||
|
}
|
||||||
|
|
||||||
%endif
|
%endif
|
||||||
|
@ -4109,6 +4109,7 @@ typedef enum mxs_set
|
|||||||
typedef enum mxs_show
|
typedef enum mxs_show
|
||||||
{
|
{
|
||||||
MXS_SHOW_COLUMNS,
|
MXS_SHOW_COLUMNS,
|
||||||
|
MXS_SHOW_CREATE_SEQUENCE,
|
||||||
MXS_SHOW_CREATE_TABLE,
|
MXS_SHOW_CREATE_TABLE,
|
||||||
MXS_SHOW_CREATE_VIEW,
|
MXS_SHOW_CREATE_VIEW,
|
||||||
MXS_SHOW_DATABASES,
|
MXS_SHOW_DATABASES,
|
||||||
|
@ -399,6 +399,7 @@ static Keyword aKeywordTable[] = {
|
|||||||
{ "SAVEPOINT", "TK_SAVEPOINT", ALWAYS },
|
{ "SAVEPOINT", "TK_SAVEPOINT", ALWAYS },
|
||||||
#ifdef MAXSCALE
|
#ifdef MAXSCALE
|
||||||
{ "SCHEMAS", "TK_DATABASES_KW", ALWAYS },
|
{ "SCHEMAS", "TK_DATABASES_KW", ALWAYS },
|
||||||
|
{ "SEQUENCE", "TK_SEQUENCE", ALWAYS },
|
||||||
#endif
|
#endif
|
||||||
{ "SELECT", "TK_SELECT", ALWAYS },
|
{ "SELECT", "TK_SELECT", ALWAYS },
|
||||||
#ifdef MAXSCALE
|
#ifdef MAXSCALE
|
||||||
|
Reference in New Issue
Block a user