8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-23 02:43:04 +01:00

Fixed problem with ALTER SEQUENCE.

This commit is contained in:
asfernandes 2014-04-19 22:17:59 +00:00
parent 913c435667
commit 128ec5aee0
4 changed files with 52 additions and 30 deletions

View File

@ -39,28 +39,6 @@ public:
}
};
// NullableClear specializations.
template <>
class NullableClear<Firebird::string> // string especialization for NullableClear
{
public:
static void clear(Firebird::string& v)
{
v = "";
}
};
template <>
class NullableClear<Firebird::MetaName> // MetaName especialization for NullableClear
{
public:
static void clear(Firebird::MetaName& v)
{
v = "";
}
};
// Nullable support without constructor, to allow usage in unions (used in the parser).
template <typename T> class BaseNullable
@ -93,6 +71,39 @@ public:
};
// NullableClear specializations.
template <>
class NullableClear<Firebird::string> // string especialization for NullableClear
{
public:
static void clear(Firebird::string& v)
{
v = "";
}
};
template <>
class NullableClear<Firebird::MetaName> // MetaName especialization for NullableClear
{
public:
static void clear(Firebird::MetaName& v)
{
v = "";
}
};
template <typename T>
class NullableClear<BaseNullable<T> >
{
public:
static void clear(BaseNullable<T>& v)
{
v.specified = false;
}
};
// Actual Nullable template.
template <typename T> class Nullable : public BaseNullable<T>
{

View File

@ -4941,7 +4941,7 @@ bool CreateAlterSequenceNode::executeAlter(thread_db* tdbb, DsqlCompilerScratch*
executeDdlTrigger(tdbb, dsqlScratch, transaction, DTW_BEFORE, DDL_TRIGGER_ALTER_SEQUENCE, name);
fb_assert(value.specified);
fb_assert(restartSpecified && value.specified);
const SINT64 val = value.specified ? value.value : 0;
if (step.specified)
{
@ -4981,8 +4981,7 @@ bool CreateAlterSequenceNode::executeAlter(thread_db* tdbb, DsqlCompilerScratch*
}
const SLONG id = X.RDB$GENERATOR_ID;
const SINT64 val = value.specified ?
value.value : (!X.RDB$INITIAL_VALUE.NULL ? X.RDB$INITIAL_VALUE : 0);
if (step.specified)
{
const SLONG newStep = step.value;
@ -4997,7 +4996,13 @@ bool CreateAlterSequenceNode::executeAlter(thread_db* tdbb, DsqlCompilerScratch*
}
}
transaction->getGenIdCache()->put(id, val);
if (restartSpecified)
{
const SINT64 val = value.specified ?
value.value : (!X.RDB$INITIAL_VALUE.NULL ? X.RDB$INITIAL_VALUE : 0);
transaction->getGenIdCache()->put(id, val);
}
dsc desc;
desc.makeText((USHORT) name.length(), ttype_metadata, (UCHAR*) name.c_str());
DFW_post_work(transaction, dfw_set_generator, &desc, id);

View File

@ -916,6 +916,7 @@ public:
create(true),
alter(false),
legacy(false),
restartSpecified(false),
name(pool, aName),
value(aValue),
step(aStep)
@ -959,6 +960,7 @@ public:
bool create;
bool alter;
bool legacy;
bool restartSpecified;
const Firebird::MetaName name;
const BaseNullable<SINT64> value;
const BaseNullable<SLONG> step;

View File

@ -607,6 +607,7 @@ using namespace Firebird;
SINT64 int64Val;
FB_UINT64 uint64Val;
BaseNullable<SINT64> nullableInt64Val;
BaseNullable<BaseNullable<SINT64> > nullableNullableInt64Val;
BaseNullable<FB_UINT64> nullableUint64Val;
Jrd::ScaledNumber scaledNumber;
UCHAR blrOp;
@ -1508,6 +1509,7 @@ replace_sequence_clause
{
CreateAlterSequenceNode* node = newNode<CreateAlterSequenceNode>(*$1, $2, $3);
node->alter = true;
node->restartSpecified = true;
$$ = node;
}
;
@ -1524,9 +1526,10 @@ alter_sequence_clause
{
if (!$2.specified && !$3.specified)
yyerrorIncompleteCmd();
CreateAlterSequenceNode* node = newNode<CreateAlterSequenceNode>(*$1, $2, $3);
CreateAlterSequenceNode* node = newNode<CreateAlterSequenceNode>(*$1, $2.value, $3);
node->create = false;
node->alter = true;
node->restartSpecified = $2.specified;
$$ = node;
}
;
@ -1537,10 +1540,10 @@ restart_value_opt
| RESTART WITH sequence_value { $$ = Nullable<SINT64>::val($3); }
;
%type <nullableInt64Val> restart_value_opt2
%type <nullableNullableInt64Val> restart_value_opt2
restart_value_opt2
: /* nothing */ { $$ = Nullable<SINT64>::empty(); }
| restart_value_opt
: /* nothing */ { $$ = Nullable<BaseNullable<SINT64> >::empty(); }
| restart_value_opt { $$ = Nullable<BaseNullable<SINT64> > ::val($1); }
;
@ -1553,6 +1556,7 @@ set_generator_clause
node->create = false;
node->alter = true;
node->legacy = true;
node->restartSpecified = true;
$$ = node;
}
;