1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-29 08:21:15 +03:00

MCOL-5890: DROP TABLE IF EXISTS should not generate errors for non existing tables

This commit is contained in:
Leonid Fedorov
2025-02-21 01:29:03 +00:00
committed by Leonid Fedorov
parent a6ab9bd615
commit 3e20a3d566
6 changed files with 99 additions and 38 deletions

View File

@ -19,7 +19,7 @@
/* $Id: ddl.y 9314 2013-03-19 17:39:25Z dhall $ */ /* $Id: ddl.y 9314 2013-03-19 17:39:25Z dhall $ */
/* This describes a substantial subset of SQL92 DDL with some /* This describes a substantial subset of SQL92 DDL with some
enhancements from various vendors. Most of the nomenclature in the enhancements from various vendors. Most of the nomenclature in the
grammar is drawn from SQL92. grammar is drawn from SQL92.
If you have to care about this grammar, you should consult one or If you have to care about this grammar, you should consult one or
more of the following sources: more of the following sources:
@ -50,7 +50,7 @@
#define scanner x->scanner #define scanner x->scanner
using namespace std; using namespace std;
using namespace ddlpackage; using namespace ddlpackage;
int ddllex(YYSTYPE* ddllval, void* yyscanner); int ddllex(YYSTYPE* ddllval, void* yyscanner);
void ddlerror(struct pass_to_bison* x, char const *s); void ddlerror(struct pass_to_bison* x, char const *s);
@ -101,7 +101,7 @@ void fix_column_length_and_charset(SchemaObject* elem, const CHARSET_INFO* def_c
column->fType->fLength = 255; column->fType->fLength = 255;
else if (column->fType->fLength <= 65535) else if (column->fType->fLength <= 65535)
column->fType->fLength = 65535; column->fType->fLength = 65535;
else else
column->fType->fLength = 16777215; column->fType->fLength = 16777215;
} }
} }
@ -244,7 +244,7 @@ ZEROFILL
%type <columnType> approximate_numeric_type %type <columnType> approximate_numeric_type
%type <str> opt_display_width %type <str> opt_display_width
%type <str> opt_display_precision_scale_null %type <str> opt_display_precision_scale_null
%type <str> opt_if_exists %type <flag> opt_if_exists
%type <str> opt_if_not_exists %type <str> opt_if_not_exists
%type <str> opt_signed %type <str> opt_signed
%type <str> opt_zerofill %type <str> opt_zerofill
@ -289,7 +289,7 @@ stmtmulti:
} }
} }
| stmt | stmt
{ {
if ($1 != NULL) if ($1 != NULL)
{ {
$$ = x->fParseTree; $$ = x->fParseTree;
@ -314,10 +314,10 @@ stmt:
; ;
drop_table_statement: drop_table_statement:
DROP TABLE opt_if_exists qualified_name {$$ = new DropTableStatement($4, false);} DROP TABLE opt_if_exists qualified_name {$$ = new DropTableStatement($4, false, $3);}
| DROP TABLE opt_if_exists qualified_name CASCADE CONSTRAINTS | DROP TABLE opt_if_exists qualified_name CASCADE CONSTRAINTS
{ {
{$$ = new DropTableStatement($4, true);} {$$ = new DropTableStatement($4, true, $3);}
} }
; ;
@ -329,7 +329,7 @@ opt_if_exists:
drop_index_statement: drop_index_statement:
DROP INDEX qualified_name {$$ = new DropIndexStatement($3);} DROP INDEX qualified_name {$$ = new DropIndexStatement($3);}
; ;
/* Notice that we allow table_options here (e.g. engine=infinidb) but /* Notice that we allow table_options here (e.g. engine=infinidb) but
we ignore them. */ we ignore them. */
create_index_statement: create_index_statement:
@ -374,7 +374,7 @@ trunc_table_statement:
rename_table_statement: rename_table_statement:
RENAME TABLE qualified_name TO qualified_name RENAME TABLE qualified_name TO qualified_name
{ {
// MCOL-876. The change reuses existing infrastructure. // MCOL-876. The change reuses existing infrastructure.
AtaRenameTable* renameAction = new AtaRenameTable($5); AtaRenameTable* renameAction = new AtaRenameTable($5);
AlterTableActionList* actionList = new AlterTableActionList(); AlterTableActionList* actionList = new AlterTableActionList();
actionList->push_back(renameAction); actionList->push_back(renameAction);
@ -526,7 +526,7 @@ table_options:
$$ = new TableOptionMap(); $$ = new TableOptionMap();
(*$$)[$1->first] = $1->second; (*$$)[$1->first] = $1->second;
delete $1; delete $1;
} }
| table_options table_option | table_options table_option
{ {
$$ = $1; $$ = $1;
@ -589,7 +589,7 @@ alter_table_actions:
/* An alter_table_statement requires at least one action. /* An alter_table_statement requires at least one action.
So, this shouldn't happen. */ So, this shouldn't happen. */
$$ = NULL; $$ = NULL;
} }
} }
| alter_table_actions ',' alter_table_action | alter_table_actions ',' alter_table_action
{ {
@ -651,7 +651,7 @@ rename_column:
{$$ = new AtaRenameColumn($2, $3, $4, $5, NULL, $6);} {$$ = new AtaRenameColumn($2, $3, $4, $5, NULL, $6);}
|CHANGE COLUMN column_name column_name data_type column_qualifier_list column_option |CHANGE COLUMN column_name column_name data_type column_qualifier_list column_option
{$$ = new AtaRenameColumn($3, $4, $5, $6, NULL, $7);} {$$ = new AtaRenameColumn($3, $4, $5, $6, NULL, $7);}
|CHANGE column_name column_name data_type default_clause |CHANGE column_name column_name data_type default_clause
{$$ = new AtaRenameColumn($2, $3, $4, NULL, $5);} {$$ = new AtaRenameColumn($2, $3, $4, NULL, $5);}
|CHANGE COLUMN column_name column_name data_type default_clause |CHANGE COLUMN column_name column_name data_type default_clause
{$$ = new AtaRenameColumn($3, $4, $5, NULL, $6);} {$$ = new AtaRenameColumn($3, $4, $5, NULL, $6);}
@ -659,22 +659,22 @@ rename_column:
{$$ = new AtaRenameColumn($2, $3, $4, NULL, $5, $6);} {$$ = new AtaRenameColumn($2, $3, $4, NULL, $5, $6);}
|CHANGE COLUMN column_name column_name data_type default_clause column_option |CHANGE COLUMN column_name column_name data_type default_clause column_option
{$$ = new AtaRenameColumn($3, $4, $5, NULL, $6, $7);} {$$ = new AtaRenameColumn($3, $4, $5, NULL, $6, $7);}
|CHANGE column_name column_name data_type column_qualifier_list default_clause |CHANGE column_name column_name data_type column_qualifier_list default_clause
{$$ = new AtaRenameColumn($2, $3, $4, $5, $6);} {$$ = new AtaRenameColumn($2, $3, $4, $5, $6);}
|CHANGE COLUMN column_name column_name data_type column_qualifier_list default_clause |CHANGE COLUMN column_name column_name data_type column_qualifier_list default_clause
{$$ = new AtaRenameColumn($3, $4, $5, $6, $7);} {$$ = new AtaRenameColumn($3, $4, $5, $6, $7);}
|CHANGE column_name column_name data_type default_clause column_qualifier_list |CHANGE column_name column_name data_type default_clause column_qualifier_list
{$$ = new AtaRenameColumn($2, $3, $4, $6, $5);} {$$ = new AtaRenameColumn($2, $3, $4, $6, $5);}
|CHANGE COLUMN column_name column_name data_type default_clause column_qualifier_list |CHANGE COLUMN column_name column_name data_type default_clause column_qualifier_list
{$$ = new AtaRenameColumn($3, $4, $5, $7, $6);} {$$ = new AtaRenameColumn($3, $4, $5, $7, $6);}
|CHANGE column_name column_name data_type column_qualifier_list default_clause column_option |CHANGE column_name column_name data_type column_qualifier_list default_clause column_option
{$$ = new AtaRenameColumn($2, $3, $4, $5, $6, $7);} {$$ = new AtaRenameColumn($2, $3, $4, $5, $6, $7);}
|CHANGE COLUMN column_name column_name data_type column_qualifier_list default_clause column_option |CHANGE COLUMN column_name column_name data_type column_qualifier_list default_clause column_option
{$$ = new AtaRenameColumn($3, $4, $5, $6, $7, $8);} {$$ = new AtaRenameColumn($3, $4, $5, $6, $7, $8);}
|CHANGE column_name column_name data_type default_clause column_qualifier_list column_option |CHANGE column_name column_name data_type default_clause column_qualifier_list column_option
{$$ = new AtaRenameColumn($2, $3, $4, $6, $5, $7);} {$$ = new AtaRenameColumn($2, $3, $4, $6, $5, $7);}
|CHANGE COLUMN column_name column_name data_type default_clause column_qualifier_list column_option |CHANGE COLUMN column_name column_name data_type default_clause column_qualifier_list column_option
{$$ = new AtaRenameColumn($3, $4, $5, $7, $6, $8);} {$$ = new AtaRenameColumn($3, $4, $5, $7, $6, $8);}
; ;
drop_table_constraint_def: drop_table_constraint_def:
@ -747,8 +747,8 @@ constraint_name:
column_option: column_option:
COMMENT string_literal {$$ = $2;} COMMENT string_literal {$$ = $2;}
column_def: column_def:
column_name data_type opt_null_tok column_name data_type opt_null_tok
{ {
$$ = new ColumnDef($1, $2, NULL, NULL ); $$ = new ColumnDef($1, $2, NULL, NULL );
@ -863,7 +863,7 @@ column_qualifier_list:
{ {
$$ = new ColumnConstraintList(); $$ = new ColumnConstraintList();
$$->push_back($1); $$->push_back($1);
} }
| column_qualifier_list column_constraint_def | column_qualifier_list column_constraint_def
{ {
$$ = $1; $$ = $1;
@ -893,7 +893,7 @@ column_constraint_def:
$3->fDeferrable = $4->fDeferrable; $3->fDeferrable = $4->fDeferrable;
$3->fCheckTime = $4->fCheckTime; $3->fCheckTime = $4->fCheckTime;
} }
} }
; ;
@ -956,7 +956,7 @@ check_constraint_def:
string_literal: string_literal:
'\'' SCONST '\'' {$$ = $2;} '\'' SCONST '\'' {$$ = $2;}
; ;
opt_quoted_literal: opt_quoted_literal:
string_literal string_literal
@ -1251,7 +1251,7 @@ opt_signed:
'(' ICONST ',' ICONST ')' {$$ = NULL;} '(' ICONST ',' ICONST ')' {$$ = NULL;}
| {$$ = NULL;} | {$$ = NULL;}
; ;
literal: literal:
ICONST ICONST
| string_literal | string_literal

View File

@ -1371,7 +1371,7 @@ struct DropTableStatement : public SqlStatement
DropTableStatement() : fTableName(nullptr) DropTableStatement() : fTableName(nullptr)
{ {
} }
EXPORT DropTableStatement(QualifiedName* qualifiedName, bool cascade); EXPORT DropTableStatement(QualifiedName* qualifiedName, bool cascade, bool ifExists = false);
/** @brief Dump to stdout. */ /** @brief Dump to stdout. */
EXPORT std::ostream& put(std::ostream& os) const override; EXPORT std::ostream& put(std::ostream& os) const override;
@ -1390,7 +1390,8 @@ struct DropTableStatement : public SqlStatement
} }
QualifiedName* fTableName; QualifiedName* fTableName;
bool fCascade; bool fCascade = false;
bool fIfExists = false;
}; };
/** @brief DebugStatement /** @brief DebugStatement

View File

@ -29,15 +29,14 @@ using namespace std;
namespace ddlpackage namespace ddlpackage
{ {
DropTableStatement::DropTableStatement(QualifiedName* qualifiedName, bool cascade) DropTableStatement::DropTableStatement(QualifiedName* qualifiedName, bool cascade, bool ifExists)
: fTableName(qualifiedName), fCascade(cascade) : fTableName(qualifiedName), fCascade(cascade), fIfExists(ifExists)
{ {
} }
ostream& DropTableStatement::put(ostream& os) const ostream& DropTableStatement::put(ostream& os) const
{ {
os << "Drop Table: " << *fTableName << " " os << "Drop Table: " << *fTableName << " " << "C=" << fCascade << endl;
<< "C=" << fCascade << endl;
return os; return os;
} }

View File

@ -178,20 +178,37 @@ DropTableProcessor::DDLResult DropTableProcessor::processPackageInternal(ddlpack
if (ie.errorCode() == ERR_TABLE_NOT_IN_CATALOG) if (ie.errorCode() == ERR_TABLE_NOT_IN_CATALOG)
{ {
Message::Args args; Message::Args args;
Message message(1); args.add("Table ");
args.add("Table does not exist in ColumnStore."); args.add(tableName.schema + "." + tableName.table);
message.format(args); args.add(" does not exist in ColumnStore.");
result.result = DROP_TABLE_NOT_IN_CATALOG_ERROR;
result.message = message; if (dropTableStmt->fIfExists) // Check if "IF EXISTS" is specified
fSessionManager.rolledback(txnID); {
return result; Message message(1); // Informational log level
message.format(args);
result.result = NO_ERROR; // Success, no error
result.message = message;
fSessionManager.committed(txnID); // No action needed, commit
return result;
}
else
{
Message message(9); // Error log level
message.format(args);
result.result = DROP_TABLE_NOT_IN_CATALOG_ERROR;
result.message = message;
fSessionManager.rolledback(txnID);
return result;
}
} }
else else
{ {
result.result = DROP_ERROR; result.result = DROP_ERROR;
Message::Args args; Message::Args args;
Message message(9); Message message(9);
args.add("Drop table failed due to "); args.add("Drop table ");
args.add(tableName.schema + "." + tableName.table);
args.add(" failed due to ");
args.add(ie.what()); args.add(ie.what());
message.format(args); message.format(args);
result.message = message; result.message = message;
@ -517,8 +534,7 @@ DropTableProcessor::DDLResult DropTableProcessor::processPackageInternal(ddlpack
if (rc != 0) if (rc != 0)
{ {
cout << txnID.id << " rolledback transaction " cout << txnID.id << " rolledback transaction " << " and valid is " << txnID.valid << endl;
<< " and valid is " << txnID.valid << endl;
fSessionManager.rolledback(txnID); fSessionManager.rolledback(txnID);
} }
else else

View File

@ -0,0 +1,16 @@
DROP DATABASE IF EXISTS MCOL5890;
CREATE DATABASE MCOL5890;
USE MCOL5890;
# Test 1: DROP TABLE IF EXISTS on non-existent table
DROP TABLE IF EXISTS test.does_not_exist;
Warnings:
Note 1051 Unknown table 'test.does_not_exist'
# Test 2: DROP TABLE on non-existent table
DROP TABLE test.does_not_exist;
ERROR 42S02: Unknown table 'test.does_not_exist'
# Test 3: DROP TABLE IF EXISTS on existing table
CREATE TABLE t1 (id INT) ENGINE=ColumnStore;
DROP TABLE IF EXISTS t1;
SELECT * FROM t1;
ERROR 42S02: Table 'MCOL5890.t1' doesn't exist
DROP DATABASE MCOL5890;

View File

@ -0,0 +1,29 @@
-- source ../include/have_columnstore.inc
# Setup: Create a test database
--disable_warnings
DROP DATABASE IF EXISTS MCOL5890;
CREATE DATABASE MCOL5890;
USE MCOL5890;
--enable_warnings
# Test 1: DROP TABLE IF EXISTS on a non-existent table should succeed silently
--echo # Test 1: DROP TABLE IF EXISTS on non-existent table
DROP TABLE IF EXISTS test.does_not_exist;
# Test 2: DROP TABLE on a non-existent table should fail with ER_BAD_TABLE_ERROR
--echo # Test 2: DROP TABLE on non-existent table
--error ER_BAD_TABLE_ERROR
DROP TABLE test.does_not_exist;
# Test 3: DROP TABLE IF EXISTS on an existing table should succeed
--echo # Test 3: DROP TABLE IF EXISTS on existing table
CREATE TABLE t1 (id INT) ENGINE=ColumnStore;
DROP TABLE IF EXISTS t1;
# Verify table is dropped
--error ER_NO_SUCH_TABLE
SELECT * FROM t1;
# Cleanup
DROP DATABASE MCOL5890;