From 127dddfe743daaa84242a2a19aa8784a9bc3c11e Mon Sep 17 00:00:00 2001 From: Adriano dos Santos Fernandes Date: Wed, 28 Dec 2016 12:57:47 -0200 Subject: [PATCH] Improvement CORE-5431 - Support for DROP IDENTITY clause. --- CHANGELOG.md | 3 +++ doc/sql.extensions/README.identity_columns.txt | 9 ++++++++- src/dsql/DdlNodes.epp | 15 +++++++++++++++ src/dsql/DdlNodes.h | 2 ++ src/dsql/parse.y | 8 ++++++++ 5 files changed, 36 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a5f09e506f..ebb5776428f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,9 @@ ## Improvements +* [CORE-5430](http://tracker.firebirdsql.org/browse/CORE-5431): Support for DROP IDENTITY clause + Contributor(s): Adriano dos Santos Fernandes + * [CORE-5430](http://tracker.firebirdsql.org/browse/CORE-5430): Support for INCREMENT option in identity columns Contributor(s): Adriano dos Santos Fernandes diff --git a/doc/sql.extensions/README.identity_columns.txt b/doc/sql.extensions/README.identity_columns.txt index acf47a612bd..5e97b5d4058 100644 --- a/doc/sql.extensions/README.identity_columns.txt +++ b/doc/sql.extensions/README.identity_columns.txt @@ -19,7 +19,8 @@ Syntax: ::= RESTART [ WITH ] | - SET INCREMENT [ BY ] + SET INCREMENT [ BY ] | + DROP IDENTITY Syntax rules: - The type of an identity column must be an exact number type with zero scale. That includes: @@ -74,3 +75,9 @@ select * from objects order by id; 2 Book 10 Computer 15 Pencil + +alter table objects + alter id set increment by 2; + +alter table objects + alter id drop identity; diff --git a/src/dsql/DdlNodes.epp b/src/dsql/DdlNodes.epp index 7b1149c0774..83740b621be 100644 --- a/src/dsql/DdlNodes.epp +++ b/src/dsql/DdlNodes.epp @@ -7847,6 +7847,21 @@ void AlterRelationNode::modifyField(thread_db* tdbb, DsqlCompilerScratch* dsqlSc } END_MODIFY } + else if (clause->dropIdentity) + { + if (RFR.RDB$GENERATOR_NAME.NULL) + { + // msg 285: "Column @1 is not an identity column" + status_exception::raise(Arg::PrivateDyn(285) << field->fld_name); + } + + DropSequenceNode::deleteIdentity(tdbb, transaction, RFR.RDB$GENERATOR_NAME); + + MODIFY RFR + RFR.RDB$GENERATOR_NAME.NULL = TRUE; + RFR.RDB$IDENTITY_TYPE.NULL = TRUE; + END_MODIFY + } else if (clause->identityRestart || clause->identityIncrement.specified) { bool found = false; diff --git a/src/dsql/DdlNodes.h b/src/dsql/DdlNodes.h index 8c688f2e59d..2604a6765f1 100644 --- a/src/dsql/DdlNodes.h +++ b/src/dsql/DdlNodes.h @@ -1383,6 +1383,7 @@ class RelationNode : public DdlNode field(NULL), defaultValue(NULL), dropDefault(false), + dropIdentity(false), identityRestart(false), computed(NULL) { @@ -1391,6 +1392,7 @@ class RelationNode : public DdlNode dsql_fld* field; NestConst defaultValue; bool dropDefault; + bool dropIdentity; bool identityRestart; Nullable identityRestartValue; Nullable identityIncrement; diff --git a/src/dsql/parse.y b/src/dsql/parse.y index 1bed23b666c..cc978174549 100644 --- a/src/dsql/parse.y +++ b/src/dsql/parse.y @@ -3944,6 +3944,14 @@ alter_op($relationNode) clause->identityIncrement = $6; $relationNode->clauses.add(clause); } + | col_opt symbol_column_name DROP IDENTITY + { + RelationNode::AlterColTypeClause* clause = newNode(); + clause->field = newNode(); + clause->field->fld_name = *$2; + clause->dropIdentity = true; + $relationNode->clauses.add(clause); + } | ALTER SQL SECURITY DEFINER { RelationNode::AlterSqlSecurityClause* clause =