|
From: <asf...@us...> - 2013-09-04 15:54:22
|
Revision: 58569
http://sourceforge.net/p/firebird/code/58569
Author: asfernandes
Date: 2013-09-04 15:54:19 +0000 (Wed, 04 Sep 2013)
Log Message:
-----------
Improvement CORE-4199 - Add optional START WITH clause to identity columns.
Modified Paths:
--------------
firebird/trunk/doc/sql.extensions/README.identity_columns.txt
firebird/trunk/src/dsql/DdlNodes.epp
firebird/trunk/src/dsql/DdlNodes.h
firebird/trunk/src/dsql/parse.y
firebird/trunk/src/isql/extract.epp
Modified: firebird/trunk/doc/sql.extensions/README.identity_columns.txt
===================================================================
--- firebird/trunk/doc/sql.extensions/README.identity_columns.txt 2013-09-04 15:39:30 UTC (rev 58568)
+++ firebird/trunk/doc/sql.extensions/README.identity_columns.txt 2013-09-04 15:54:19 UTC (rev 58569)
@@ -11,7 +11,7 @@
Syntax:
<column definition> ::=
- <name> <type> GENERATED BY DEFAULT AS IDENTITY <constraints>
+ <name> <type> GENERATED BY DEFAULT AS IDENTITY [ (START WITH <value>) ] <constraints>
Syntax rules:
- The type of an identity column must be an exact number type with zero scale. That includes:
Modified: firebird/trunk/src/dsql/DdlNodes.epp
===================================================================
--- firebird/trunk/src/dsql/DdlNodes.epp 2013-09-04 15:39:30 UTC (rev 58568)
+++ firebird/trunk/src/dsql/DdlNodes.epp 2013-09-04 15:54:19 UTC (rev 58569)
@@ -4890,14 +4890,8 @@
executeDdlTrigger(tdbb, dsqlScratch, transaction, DTW_BEFORE, DDL_TRIGGER_CREATE_SEQUENCE, name);
const SINT64 val = value.specified ? value.value : 0;
+ store(tdbb, transaction, name, fb_sysflag_user, val);
- const SSHORT id = store(tdbb, transaction, name, fb_sysflag_user, val);
- fb_assert(id > 0);
-
- // the store() call above has caused the DFW item to be posted,
- // so we just adjust the cached generator value
- transaction->getGenIdCache()->put(id, val);
-
executeDdlTrigger(tdbb, dsqlScratch, transaction, DTW_AFTER, DDL_TRIGGER_CREATE_SEQUENCE, name);
}
@@ -5012,6 +5006,10 @@
storePrivileges(tdbb, transaction, name, obj_generator, USAGE_PRIVILEGES);
+ // The STORE above has caused the DFW item to be posted, so we just adjust the cached
+ // generator value.
+ transaction->getGenIdCache()->put(storedId, val);
+
return storedId;
}
@@ -5546,7 +5544,7 @@
DYN_UTIL_generate_generator_name(tdbb, fieldDefinition.identitySequence);
CreateAlterSequenceNode::store(tdbb, transaction, fieldDefinition.identitySequence,
- fb_sysflag_identity_generator, 0);
+ fb_sysflag_identity_generator, clause->identityStart);
}
BlrDebugWriter::BlrData defaultValue;
Modified: firebird/trunk/src/dsql/DdlNodes.h
===================================================================
--- firebird/trunk/src/dsql/DdlNodes.h 2013-09-04 15:39:30 UTC (rev 58568)
+++ firebird/trunk/src/dsql/DdlNodes.h 2013-09-04 15:54:19 UTC (rev 58569)
@@ -1168,7 +1168,8 @@
constraints(p),
collate(p),
computed(NULL),
- identity(false)
+ identity(false),
+ identityStart(0)
{
}
@@ -1178,6 +1179,7 @@
Firebird::MetaName collate;
NestConst<ValueSourceClause> computed;
bool identity;
+ SINT64 identityStart;
};
struct AlterColNameClause : public Clause
Modified: firebird/trunk/src/dsql/parse.y
===================================================================
--- firebird/trunk/src/dsql/parse.y 2013-09-04 15:39:30 UTC (rev 58568)
+++ firebird/trunk/src/dsql/parse.y 2013-09-04 15:54:19 UTC (rev 58569)
@@ -1466,10 +1466,15 @@
%type <nullableInt64Val> start_with_opt
start_with_opt
- : /* nothing */ { $$ = Nullable<SINT64>::empty(); }
- | START WITH sequence_value { $$ = Nullable<SINT64>::val($3); }
+ : /* nothing */ { $$ = Nullable<SINT64>::empty(); }
+ | start_with { $$ = Nullable<SINT64>::val($1); }
;
+%type <int64Val> start_with
+start_with
+ : START WITH sequence_value { $$ = $3; }
+ ;
+
%type <createAlterSequenceNode> replace_sequence_clause
replace_sequence_clause
: symbol_generator_name replace_sequence_options
@@ -1805,6 +1810,7 @@
clause->field = $2;
clause->field->fld_name = *$1;
clause->identity = true;
+ clause->identityStart = $3;
$relationNode->clauses.add(clause);
}
column_constraint_clause(NOTRIAL($<addColumnClause>4)) collate_clause
@@ -1832,10 +1838,17 @@
}
;
+%type <int64Val> identity_clause
identity_clause
- : GENERATED BY DEFAULT AS IDENTITY
+ : GENERATED BY DEFAULT AS IDENTITY identity_clause_options { $$ = $6; }
;
+%type <int64Val> identity_clause_options
+identity_clause_options
+ : /* nothing */ { $$ = 0; }
+ | '(' start_with ')' { $$ = $2; }
+ ;
+
// value does allow parens around it, but there is a problem getting the source text.
%type <valueSourceClause> def_computed
Modified: firebird/trunk/src/isql/extract.epp
===================================================================
--- firebird/trunk/src/isql/extract.epp 2013-09-04 15:39:30 UTC (rev 58568)
+++ firebird/trunk/src/isql/extract.epp 2013-09-04 15:54:19 UTC (rev 58569)
@@ -510,12 +510,17 @@
if (ENCODE_ODS(isqlGlob.major_ods, isqlGlob.minor_ods) >= ODS_12_0)
{
- FOR RFR2 IN RDB$RELATION_FIELDS
- WITH RFR2.RDB$RELATION_NAME = RFR.RDB$RELATION_NAME AND
+ FOR RFR2 IN RDB$RELATION_FIELDS CROSS
+ GEN IN RDB$GENERATORS
+ WITH GEN.RDB$GENERATOR_NAME = RFR2.RDB$GENERATOR_NAME AND
+ RFR2.RDB$RELATION_NAME = RFR.RDB$RELATION_NAME AND
RFR2.RDB$FIELD_NAME = RFR.RDB$FIELD_NAME
+
{
- if (!RFR2.RDB$GENERATOR_NAME.NULL)
- isqlGlob.printf(" GENERATED BY DEFAULT AS IDENTITY");
+ isqlGlob.printf(" GENERATED BY DEFAULT AS IDENTITY");
+
+ if (!GEN.RDB$INITIAL_VALUE.NULL && GEN.RDB$INITIAL_VALUE != 0)
+ isqlGlob.printf(" (START WITH %" SQUADFORMAT ")", GEN.RDB$INITIAL_VALUE);
}
END_FOR
ON_ERROR
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|