diff --git a/query_classifier/qc_sqlite/qc_sqlite.cc b/query_classifier/qc_sqlite/qc_sqlite.cc index d57cbc4e3..bfc5c524a 100644 --- a/query_classifier/qc_sqlite/qc_sqlite.cc +++ b/query_classifier/qc_sqlite/qc_sqlite.cc @@ -2239,24 +2239,44 @@ public: m_type_mask = (QUERY_TYPE_WRITE | QUERY_TYPE_COMMIT); m_operation = QUERY_OP_DROP; - if (what == MXS_DROP_SEQUENCE) + switch (what) { - const char* zDatabase = NULL; - char database[pDatabase ? pDatabase->n + 1 : 1]; - - if (pDatabase) + case MXS_DROP_DATABASE: { +#ifdef TODO_SPECIFIC_OP_FOR_DROP_DATABASE_ADDED + // TODO: As there is only QUERY_OP_DROP, you can't be fully + // TODO: certain what a returned database actually refers to + // TODO: so better not to provide a name until there is a + // TODO: specific op. + char database[pDatabase->n + 1]; strncpy(database, pDatabase->z, pDatabase->n); database[pDatabase->n] = 0; - zDatabase = database; + update_database_names(database); +#endif } + break; - char table[pName->n + 1]; - strncpy(table, pName->z, pName->n); - table[pName->n] = 0; + case MXS_DROP_SEQUENCE: + { + const char* zDatabase = NULL; + char database[pDatabase ? pDatabase->n + 1 : 1]; - update_names(zDatabase, table, NULL, NULL); + if (pDatabase) + { + strncpy(database, pDatabase->z, pDatabase->n); + database[pDatabase->n] = 0; + + zDatabase = database; + } + + char table[pName->n + 1]; + strncpy(table, pName->z, pName->n); + table[pName->n] = 0; + + update_names(zDatabase, table, NULL, NULL); + } + break; } } diff --git a/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y b/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y index e23ef97d6..67088e537 100644 --- a/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y +++ b/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y @@ -615,7 +615,7 @@ columnid(A) ::= nm(X). { // TODO: However, if not here then rules such as CAST need to be modified. BINARY /*CASCADE*/ CAST CLOSE COLUMNKW COLUMNS COMMENT CONCURRENT /*CONFLICT*/ - DATA /*DATABASE*/ DEALLOCATE DEFERRED /*DESC*/ /*DETACH*/ DUMPFILE + DATA DATABASE DEALLOCATE DEFERRED /*DESC*/ /*DETACH*/ DUMPFILE /*EACH*/ END ENGINE ENUM EXCLUSIVE /*EXPLAIN*/ FIRST FLUSH /*FOR*/ FORMAT GLOBAL @@ -2861,6 +2861,12 @@ eq_opt ::= EQ. default_opt ::= . default_opt ::= DEFAULT. +////////////////////////// DROP DATABASE statement ///////////////////////////////////// +// +cmd ::= DROP DATABASE ifexists id(X). { + maxscaleDrop(pParse, MXS_DROP_DATABASE, &X, NULL); +} + //////////////////////// CALL statement //////////////////////////////////// // cmd ::= call. diff --git a/query_classifier/qc_sqlite/sqlite-src-3110100/src/sqliteInt.h b/query_classifier/qc_sqlite/sqlite-src-3110100/src/sqliteInt.h index 2a19b2f77..fdc3217a6 100644 --- a/query_classifier/qc_sqlite/sqlite-src-3110100/src/sqliteInt.h +++ b/query_classifier/qc_sqlite/sqlite-src-3110100/src/sqliteInt.h @@ -4094,6 +4094,7 @@ int sqlite3DbstatRegister(sqlite3*); typedef enum mxs_drop { + MXS_DROP_DATABASE, MXS_DROP_FUNCTION, MXS_DROP_SEQUENCE, } mxs_drop_t; diff --git a/query_classifier/qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c b/query_classifier/qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c index 18017915c..675c543c4 100644 --- a/query_classifier/qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c +++ b/query_classifier/qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c @@ -216,8 +216,10 @@ static Keyword aKeywordTable[] = { { "CURRENT_TIMESTAMP","TK_CTIME_KW", ALWAYS }, #ifdef MAXSCALE { "DATA", "TK_DATA", ALWAYS }, -#endif + { "DATABASE", "TK_DATABASE", ALWAYS }, +#else { "DATABASE", "TK_DATABASE", ATTACH }, +#endif #ifdef MAXSCALE { "DATABASES", "TK_DATABASES_KW", ALWAYS }, { "DEALLOCATE", "TK_DEALLOCATE", ALWAYS },