You've already forked mariadb-columnstore-engine
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:
committed by
Leonid Fedorov
parent
a6ab9bd615
commit
3e20a3d566
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
16
mysql-test/columnstore/bugfixes/mcol-5890.result
Normal file
16
mysql-test/columnstore/bugfixes/mcol-5890.result
Normal 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;
|
29
mysql-test/columnstore/bugfixes/mcol-5890.test
Normal file
29
mysql-test/columnstore/bugfixes/mcol-5890.test
Normal 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;
|
Reference in New Issue
Block a user