8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-22 17:23:03 +01:00

Improvement CORE-4199 - Add optional START WITH clause to identity columns.

This commit is contained in:
asfernandes 2013-09-04 15:54:19 +00:00
parent 4097497416
commit 4789ba1672
5 changed files with 35 additions and 17 deletions

View File

@ -11,7 +11,7 @@ Description:
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:

View File

@ -4890,13 +4890,7 @@ void CreateAlterSequenceNode::executeCreate(thread_db* tdbb, DsqlCompilerScratch
executeDdlTrigger(tdbb, dsqlScratch, transaction, DTW_BEFORE, DDL_TRIGGER_CREATE_SEQUENCE, name);
const SINT64 val = value.specified ? value.value : 0;
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);
store(tdbb, transaction, name, fb_sysflag_user, val);
executeDdlTrigger(tdbb, dsqlScratch, transaction, DTW_AFTER, DDL_TRIGGER_CREATE_SEQUENCE, name);
}
@ -5012,6 +5006,10 @@ SSHORT CreateAlterSequenceNode::store(thread_db* tdbb, jrd_tra* transaction, con
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 @@ void RelationNode::defineField(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch
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;

View File

@ -1168,7 +1168,8 @@ public:
constraints(p),
collate(p),
computed(NULL),
identity(false)
identity(false),
identityStart(0)
{
}
@ -1178,6 +1179,7 @@ public:
Firebird::MetaName collate;
NestConst<ValueSourceClause> computed;
bool identity;
SINT64 identityStart;
};
struct AlterColNameClause : public Clause

View File

@ -1466,8 +1466,13 @@ generator_clause
%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
@ -1805,6 +1810,7 @@ column_def($relationNode)
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,8 +1838,15 @@ column_def($relationNode)
}
;
%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.

View File

@ -510,12 +510,17 @@ int EXTRACT_list_table(const SCHAR* relation_name,
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