|
From: <asf...@us...> - 2012-04-25 01:42:56
|
Revision: 54402
http://firebird.svn.sourceforge.net/firebird/?rev=54402&view=rev
Author: asfernandes
Date: 2012-04-25 01:42:47 +0000 (Wed, 25 Apr 2012)
Log Message:
-----------
Getting rid of dsql_nod.
Modified Paths:
--------------
firebird/trunk/builds/posix/make.shared.targets
firebird/trunk/builds/win32/parse.bat
firebird/trunk/src/common/classes/objects_array.h
firebird/trunk/src/dsql/AggNodes.cpp
firebird/trunk/src/dsql/AggNodes.h
firebird/trunk/src/dsql/BlrWriter.h
firebird/trunk/src/dsql/BoolNodes.cpp
firebird/trunk/src/dsql/BoolNodes.h
firebird/trunk/src/dsql/DdlNodes.epp
firebird/trunk/src/dsql/DdlNodes.h
firebird/trunk/src/dsql/DsqlCompilerScratch.cpp
firebird/trunk/src/dsql/DsqlCompilerScratch.h
firebird/trunk/src/dsql/ExprNodes.cpp
firebird/trunk/src/dsql/ExprNodes.h
firebird/trunk/src/dsql/Nodes.h
firebird/trunk/src/dsql/PackageNodes.epp
firebird/trunk/src/dsql/PackageNodes.h
firebird/trunk/src/dsql/Parser.h
firebird/trunk/src/dsql/StmtNodes.cpp
firebird/trunk/src/dsql/StmtNodes.h
firebird/trunk/src/dsql/Visitors.h
firebird/trunk/src/dsql/WinNodes.cpp
firebird/trunk/src/dsql/WinNodes.h
firebird/trunk/src/dsql/ddl.cpp
firebird/trunk/src/dsql/dsql.cpp
firebird/trunk/src/dsql/dsql.h
firebird/trunk/src/dsql/gen.cpp
firebird/trunk/src/dsql/gen_proto.h
firebird/trunk/src/dsql/make.cpp
firebird/trunk/src/dsql/make_proto.h
firebird/trunk/src/dsql/metd_proto.h
firebird/trunk/src/dsql/parse.y
firebird/trunk/src/dsql/pass1.cpp
firebird/trunk/src/dsql/pass1_proto.h
firebird/trunk/src/jrd/RecordSourceNodes.cpp
firebird/trunk/src/jrd/RecordSourceNodes.h
firebird/trunk/src/jrd/obj.h
Removed Paths:
-------------
firebird/trunk/src/dsql/node.h
Modified: firebird/trunk/builds/posix/make.shared.targets
===================================================================
--- firebird/trunk/builds/posix/make.shared.targets 2012-04-24 07:03:15 UTC (rev 54401)
+++ firebird/trunk/builds/posix/make.shared.targets 2012-04-25 01:42:47 UTC (rev 54402)
@@ -42,7 +42,10 @@
# This rule creates parse.cpp from parse.y
$(OBJ)/dsql/parse.cpp $(SRC_ROOT)/include/gen/parse.h: $(SRC_ROOT)/dsql/parse.y $(SRC_ROOT)/dsql/btyacc_fb.ske
- $(BTYACC) -l -d -S $(SRC_ROOT)/dsql/btyacc_fb.ske $<
+ sed -n '/%type .*/p' < $< > $(GEN_ROOT)/y.types
+ sed 's/%type .*//' < $< > $(GEN_ROOT)/y.y
+ sed $(INLINE_EDIT_SED) '/\/*\*\* TYPES \*\*\*\//r $(GEN_ROOT)/y.types' $(GEN_ROOT)/y.y
+ $(BTYACC) -l -d -S $(SRC_ROOT)/dsql/btyacc_fb.ske $(GEN_ROOT)/y.y
$(MV) $(GEN_ROOT)/y_tab.c $(OBJ)/dsql/parse.cpp
$(MV) $(GEN_ROOT)/y_tab.h $(SRC_ROOT)/include/gen/parse.h
Modified: firebird/trunk/builds/win32/parse.bat
===================================================================
--- firebird/trunk/builds/win32/parse.bat 2012-04-24 07:03:15 UTC (rev 54401)
+++ firebird/trunk/builds/win32/parse.bat 2012-04-25 01:42:47 UTC (rev 54402)
@@ -1,4 +1,3 @@
-
@echo off
@echo.
@@ -10,10 +9,16 @@
@echo Generating parse.cpp and dsql.tab.h
-%FB_ROOT_PATH%\temp\%FB_OBJ_DIR%\btyacc\btyacc -l -d -S %FB_ROOT_PATH%\src\dsql\btyacc_fb.ske %FB_ROOT_PATH%\src\dsql\parse.y
+@sed -n '/%type .*/p' < %FB_ROOT_PATH%\src\dsql\parse.y > y.types
+@sed 's/%type .*//' < %FB_ROOT_PATH%\src\dsql\parse.y > y.y
+@sed $(INLINE_EDIT_SED) '/\/*\*\* TYPES \*\*\*\//r y.types' y.y
+
+%FB_ROOT_PATH%\temp\%FB_OBJ_DIR%\btyacc\btyacc -l -d -S %FB_ROOT_PATH%\src\dsql\btyacc_fb.ske y.y
@if errorlevel 1 (exit /B 1)
@copy y_tab.h %FB_ROOT_PATH%\src\include\gen\parse.h > nul
@copy y_tab.c %FB_ROOT_PATH%\src\dsql\parse.cpp > nul
+@del y.y
+@del y.types
@del y_tab.h
@del y_tab.c
Modified: firebird/trunk/src/common/classes/objects_array.h
===================================================================
--- firebird/trunk/src/common/classes/objects_array.h 2012-04-24 07:03:15 UTC (rev 54401)
+++ firebird/trunk/src/common/classes/objects_array.h 2012-04-25 01:42:47 UTC (rev 54402)
@@ -190,6 +190,12 @@
T* dataL = FB_NEW(this->getPool()) T(this->getPool(), item);
inherited::insert(index, dataL);
}
+ T& insert(size_t index)
+ {
+ T* dataL = FB_NEW(this->getPool()) T(this->getPool());
+ inherited::insert(index, dataL);
+ return *dataL;
+ }
size_t add(const T& item)
{
T* dataL = FB_NEW(this->getPool()) T(this->getPool(), item);
Modified: firebird/trunk/src/dsql/AggNodes.cpp
===================================================================
--- firebird/trunk/src/dsql/AggNodes.cpp 2012-04-24 07:03:15 UTC (rev 54401)
+++ firebird/trunk/src/dsql/AggNodes.cpp 2012-04-25 01:42:47 UTC (rev 54402)
@@ -21,7 +21,6 @@
#include "firebird.h"
#include "../dsql/AggNodes.h"
#include "../dsql/ExprNodes.h"
-#include "../dsql/node.h"
#include "../jrd/jrd.h"
#include "../jrd/blr.h"
#include "../jrd/btr.h"
@@ -49,7 +48,7 @@
AggNode::AggNode(MemoryPool& pool, const AggInfo& aAggInfo, bool aDistinct, bool aDialect1,
- dsql_nod* aArg)
+ ValueExprNode* aArg)
: TypedNode<ValueExprNode, ExprNode::TYPE_AGGREGATE>(pool),
aggInfo(aAggInfo),
distinct(aDistinct),
@@ -82,17 +81,10 @@
return dsqlCopy(dsqlScratch);
}
-void AggNode::print(string& text, Array<dsql_nod*>& nodes) const
+void AggNode::print(string& text) const
{
text = string("AggNode (") + aggInfo.name + ")";
-
- for (dsql_nod* const* const* i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i)
- {
- if (**i)
- nodes.add(**i);
- }
-
- ExprNode::print(text, nodes);
+ ExprNode::print(text);
}
bool AggNode::dsqlAggregateFinder(AggregateFinder& visitor)
@@ -114,8 +106,11 @@
AutoSetRestore<USHORT> autoDeepestLevel(&visitor.deepestLevel, 0);
AutoSetRestore<bool> autoIgnoreSubSelects(&visitor.ignoreSubSelects, true);
- for (dsql_nod*** i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i)
- visitor.visit(*i);
+ for (NodeRef** i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i)
+ {
+ if (*i)
+ visitor.visit((*i)->getExpr());
+ }
localDeepestLevel = visitor.deepestLevel;
}
@@ -143,8 +138,8 @@
AutoSetRestore<USHORT> autoDeepestLevel(&visitor.deepestLevel, localDeepestLevel);
- for (dsql_nod*** i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i)
- aggregate |= visitor.visit(*i);
+ for (NodeRef** i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i)
+ aggregate |= *i && visitor.visit((*i)->getExpr());
}
return aggregate;
@@ -158,8 +153,8 @@
bool found = false;
FieldFinder fieldFinder(visitor.checkScopeLevel, visitor.matchType);
- for (dsql_nod*** i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i)
- found |= fieldFinder.visit(*i);
+ for (NodeRef** i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i)
+ found |= *i && visitor.visit((*i)->getExpr());
if (!fieldFinder.getField())
{
@@ -202,14 +197,14 @@
if (!visitor.insideHigherMap)
{
- for (dsql_nod*** i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i)
+ for (NodeRef** i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i)
{
// If there's another aggregate with the same scope_level or
// an higher one then it's a invalid aggregate, because
// aggregate-functions from the same context can't
// be part of each other.
- if (Aggregate2Finder::find(visitor.context->ctx_scope_level,
- FIELD_MATCH_TYPE_EQUAL, false, **i))
+ if (*i && Aggregate2Finder::find(visitor.context->ctx_scope_level,
+ FIELD_MATCH_TYPE_EQUAL, false, (*i)->getExpr()))
{
// Nested aggregate functions are not allowed
ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) <<
@@ -226,7 +221,7 @@
return false;
}
-bool AggNode::dsqlFieldRemapper(FieldRemapper& visitor)
+ValueExprNode* AggNode::dsqlFieldRemapper(FieldRemapper& visitor)
{
AggregateFinder aggFinder(visitor.dsqlScratch, false);
aggFinder.deepestLevel = visitor.dsqlScratch->scopeLevel;
@@ -236,16 +231,18 @@
{
if (!visitor.window && visitor.dsqlScratch->scopeLevel == aggFinder.deepestLevel)
{
- visitor.replaceNode(PASS1_post_map(visitor.dsqlScratch, visitor.getCurrentNode(),
- visitor.context, visitor.partitionNode, visitor.orderNode));
- return false;
+ return PASS1_post_map(visitor.dsqlScratch, this,
+ visitor.context, visitor.partitionNode, visitor.orderNode);
}
}
- for (dsql_nod*** i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i)
- visitor.visit(*i);
+ for (NodeRef** i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i)
+ {
+ if (*i)
+ (*i)->remap(visitor);
+ }
- return false;
+ return this;
}
bool AggNode::dsqlMatch(const ExprNode* other, bool ignoreMapCast) const
@@ -277,23 +274,24 @@
dsqlScratch->appendNullString(aggInfo.name);
unsigned count = 0;
- for (dsql_nod*** i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i)
+
+ for (NodeRef** i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i)
{
- if (**i)
+ if (*i && (*i)->getExpr())
++count;
}
dsqlScratch->appendUChar(UCHAR(count));
}
- for (dsql_nod*** i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i)
+ for (NodeRef** i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i)
{
- if (**i)
- GEN_expr(dsqlScratch, **i);
+ if (*i)
+ GEN_expr(dsqlScratch, (*i)->getExpr());
}
}
-ValueExprNode* AggNode::pass2(thread_db* tdbb, CompilerScratch* csb)
+AggNode* AggNode::pass2(thread_db* tdbb, CompilerScratch* csb)
{
ValueExprNode::pass2(tdbb, csb);
@@ -437,7 +435,7 @@
static AggNode::Register<AvgAggNode> avgAggInfo("AVG", blr_agg_average, blr_agg_average_distinct);
-AvgAggNode::AvgAggNode(MemoryPool& pool, bool aDistinct, bool aDialect1, dsql_nod* aArg)
+AvgAggNode::AvgAggNode(MemoryPool& pool, bool aDistinct, bool aDialect1, ValueExprNode* aArg)
: AggNode(pool, avgAggInfo, aDistinct, aDialect1, aArg),
tempImpure(0)
{
@@ -564,12 +562,14 @@
return node;
}
-ValueExprNode* AvgAggNode::pass2(thread_db* tdbb, CompilerScratch* csb)
+AggNode* AvgAggNode::pass2(thread_db* tdbb, CompilerScratch* csb)
{
+ AggNode::pass2(tdbb, csb);
+
if (dialect1)
nodFlags |= FLAG_DOUBLE;
- return AggNode::pass2(tdbb, csb);
+ return this;
}
void AvgAggNode::aggPostRse(thread_db* tdbb, CompilerScratch* csb)
@@ -641,7 +641,7 @@
AggNode* AvgAggNode::dsqlCopy(DsqlCompilerScratch* dsqlScratch) const
{
return FB_NEW(getPool()) AvgAggNode(getPool(), distinct, dialect1,
- PASS1_node(dsqlScratch, dsqlArg));
+ doDsqlPass(dsqlScratch, dsqlArg));
}
@@ -650,7 +650,8 @@
static AggNode::Register<ListAggNode> listAggInfo("LIST", blr_agg_list, blr_agg_list_distinct);
-ListAggNode::ListAggNode(MemoryPool& pool, bool aDistinct, dsql_nod* aArg, dsql_nod* aDelimiter)
+ListAggNode::ListAggNode(MemoryPool& pool, bool aDistinct, ValueExprNode* aArg,
+ ValueExprNode* aDelimiter)
: AggNode(pool, listAggInfo, aDistinct, false, aArg),
dsqlDelimiter(aDelimiter),
delimiter(NULL)
@@ -675,10 +676,10 @@
}
bool ListAggNode::setParameterType(DsqlCompilerScratch* dsqlScratch,
- dsql_nod* node, bool forceVarChar)
+ const dsc* desc, bool forceVarChar)
{
- return PASS1_set_parameter_type(dsqlScratch, dsqlArg, node, forceVarChar) |
- PASS1_set_parameter_type(dsqlScratch, dsqlDelimiter, node, forceVarChar);
+ return PASS1_set_parameter_type(dsqlScratch, dsqlArg, desc, forceVarChar) |
+ PASS1_set_parameter_type(dsqlScratch, dsqlDelimiter, desc, forceVarChar);
}
void ListAggNode::getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc)
@@ -768,7 +769,7 @@
AggNode* ListAggNode::dsqlCopy(DsqlCompilerScratch* dsqlScratch) const
{
return FB_NEW(getPool()) ListAggNode(getPool(), distinct,
- PASS1_node(dsqlScratch, dsqlArg), PASS1_node(dsqlScratch, dsqlDelimiter));
+ doDsqlPass(dsqlScratch, dsqlArg), doDsqlPass(dsqlScratch, dsqlDelimiter));
}
@@ -779,7 +780,7 @@
static AggNode::Register<CountAggNode> countAggInfo("COUNT", blr_agg_count2, blr_agg_count_distinct);
-CountAggNode::CountAggNode(MemoryPool& pool, bool aDistinct, bool aDialect1, dsql_nod* aArg)
+CountAggNode::CountAggNode(MemoryPool& pool, bool aDistinct, bool aDialect1, ValueExprNode* aArg)
: AggNode(pool, countAggInfo, aDistinct, aDialect1, aArg)
{
}
@@ -860,7 +861,7 @@
AggNode* CountAggNode::dsqlCopy(DsqlCompilerScratch* dsqlScratch) const
{
return FB_NEW(getPool()) CountAggNode(getPool(), distinct, dialect1,
- PASS1_node(dsqlScratch, dsqlArg));
+ doDsqlPass(dsqlScratch, dsqlArg));
}
@@ -869,7 +870,7 @@
static AggNode::Register<SumAggNode> sumAggInfo("SUM", blr_agg_total, blr_agg_total_distinct);
-SumAggNode::SumAggNode(MemoryPool& pool, bool aDistinct, bool aDialect1, dsql_nod* aArg)
+SumAggNode::SumAggNode(MemoryPool& pool, bool aDistinct, bool aDialect1, ValueExprNode* aArg)
: AggNode(pool, sumAggInfo, aDistinct, aDialect1, aArg)
{
dsqlCompatDialectVerb = "sum";
@@ -1113,7 +1114,7 @@
AggNode* SumAggNode::dsqlCopy(DsqlCompilerScratch* dsqlScratch) const
{
return FB_NEW(getPool()) SumAggNode(getPool(), distinct, dialect1,
- PASS1_node(dsqlScratch, dsqlArg));
+ doDsqlPass(dsqlScratch, dsqlArg));
}
@@ -1123,7 +1124,7 @@
static AggNode::Register<MaxMinAggNode> maxAggInfo("MAX", blr_agg_max);
static AggNode::Register<MaxMinAggNode> minAggInfo("MIN", blr_agg_min);
-MaxMinAggNode::MaxMinAggNode(MemoryPool& pool, MaxMinType aType, dsql_nod* aArg)
+MaxMinAggNode::MaxMinAggNode(MemoryPool& pool, MaxMinType aType, ValueExprNode* aArg)
: AggNode(pool, (aType == MaxMinAggNode::TYPE_MAX ? maxAggInfo : minAggInfo), false, false, aArg),
type(aType)
{
@@ -1194,7 +1195,7 @@
AggNode* MaxMinAggNode::dsqlCopy(DsqlCompilerScratch* dsqlScratch) const
{
- return FB_NEW(getPool()) MaxMinAggNode(getPool(), type, PASS1_node(dsqlScratch, dsqlArg));
+ return FB_NEW(getPool()) MaxMinAggNode(getPool(), type, doDsqlPass(dsqlScratch, dsqlArg));
}
Modified: firebird/trunk/src/dsql/AggNodes.h
===================================================================
--- firebird/trunk/src/dsql/AggNodes.h 2012-04-24 07:03:15 UTC (rev 54401)
+++ firebird/trunk/src/dsql/AggNodes.h 2012-04-25 01:42:47 UTC (rev 54402)
@@ -32,14 +32,14 @@
class AvgAggNode : public AggNode
{
public:
- explicit AvgAggNode(MemoryPool& pool, bool aDistinct, bool aDialect1, dsql_nod* aArg = NULL);
+ explicit AvgAggNode(MemoryPool& pool, bool aDistinct, bool aDialect1, ValueExprNode* aArg = NULL);
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier) const;
- virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
+ virtual AggNode* pass2(thread_db* tdbb, CompilerScratch* csb);
virtual void aggPostRse(thread_db* tdbb, CompilerScratch* csb);
virtual void aggInit(thread_db* tdbb, jrd_req* request) const;
@@ -56,14 +56,14 @@
class ListAggNode : public AggNode
{
public:
- explicit ListAggNode(MemoryPool& pool, bool aDistinct, dsql_nod* aArg = NULL,
- dsql_nod* aDelimiter = NULL);
+ explicit ListAggNode(MemoryPool& pool, bool aDistinct, ValueExprNode* aArg = NULL,
+ ValueExprNode* aDelimiter = NULL);
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
virtual bool setParameterType(DsqlCompilerScratch* dsqlScratch,
- dsql_nod* node, bool forceVarChar);
+ const dsc* desc, bool forceVarChar);
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier) const;
@@ -83,14 +83,14 @@
virtual AggNode* dsqlCopy(DsqlCompilerScratch* dsqlScratch) const;
private:
- dsql_nod* dsqlDelimiter;
+ ValueExprNode* dsqlDelimiter;
NestConst<ValueExprNode> delimiter;
};
class CountAggNode : public AggNode
{
public:
- explicit CountAggNode(MemoryPool& pool, bool aDistinct, bool aDialect1, dsql_nod* aArg = NULL);
+ explicit CountAggNode(MemoryPool& pool, bool aDistinct, bool aDialect1, ValueExprNode* aArg = NULL);
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
@@ -110,7 +110,7 @@
class SumAggNode : public AggNode
{
public:
- explicit SumAggNode(MemoryPool& pool, bool aDistinct, bool aDialect1, dsql_nod* aArg = NULL);
+ explicit SumAggNode(MemoryPool& pool, bool aDistinct, bool aDialect1, ValueExprNode* aArg = NULL);
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
@@ -135,7 +135,7 @@
TYPE_MIN
};
- explicit MaxMinAggNode(MemoryPool& pool, MaxMinType aType, dsql_nod* aArg = NULL);
+ explicit MaxMinAggNode(MemoryPool& pool, MaxMinType aType, ValueExprNode* aArg = NULL);
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
Modified: firebird/trunk/src/dsql/BlrWriter.h
===================================================================
--- firebird/trunk/src/dsql/BlrWriter.h 2012-04-24 07:03:15 UTC (rev 54401)
+++ firebird/trunk/src/dsql/BlrWriter.h 2012-04-25 01:42:47 UTC (rev 54402)
@@ -28,7 +28,6 @@
namespace Jrd {
-class dsql_nod;
class DeclareSubFuncNode;
class DeclareSubProcNode;
Modified: firebird/trunk/src/dsql/BoolNodes.cpp
===================================================================
--- firebird/trunk/src/dsql/BoolNodes.cpp 2012-04-24 07:03:15 UTC (rev 54401)
+++ firebird/trunk/src/dsql/BoolNodes.cpp 2012-04-25 01:42:47 UTC (rev 54402)
@@ -22,7 +22,6 @@
#include "../common/classes/VaryStr.h"
#include "../dsql/BoolNodes.h"
#include "../dsql/ExprNodes.h"
-#include "../dsql/node.h"
#include "../jrd/align.h"
#include "../jrd/blr.h"
#include "../common/quad.h"
@@ -134,7 +133,8 @@
static RegisterBoolNode<BinaryBoolNode> regBinaryBoolNodeAnd(blr_and);
static RegisterBoolNode<BinaryBoolNode> regBinaryBoolNodeOr(blr_or);
-BinaryBoolNode::BinaryBoolNode(MemoryPool& pool, UCHAR aBlrOp, dsql_nod* aArg1, dsql_nod* aArg2)
+BinaryBoolNode::BinaryBoolNode(MemoryPool& pool, UCHAR aBlrOp, BoolExprNode* aArg1,
+ BoolExprNode* aArg2)
: TypedNode<BoolExprNode, ExprNode::TYPE_BINARY_BOOL>(pool),
blrOp(aBlrOp),
dsqlArg1(aArg1),
@@ -154,16 +154,16 @@
return node;
}
-void BinaryBoolNode::print(string& text, Array<dsql_nod*>& nodes) const
+void BinaryBoolNode::print(string& text) const
{
text.printf("BinaryBoolNode (%d)", blrOp);
- BoolExprNode::print(text, nodes);
+ BoolExprNode::print(text);
}
BoolExprNode* BinaryBoolNode::dsqlPass(DsqlCompilerScratch* dsqlScratch)
{
return FB_NEW(getPool()) BinaryBoolNode(getPool(), blrOp,
- PASS1_node(dsqlScratch, dsqlArg1), PASS1_node(dsqlScratch, dsqlArg2));
+ doDsqlPass(dsqlScratch, dsqlArg1), doDsqlPass(dsqlScratch, dsqlArg2));
}
void BinaryBoolNode::genBlr(DsqlCompilerScratch* dsqlScratch)
@@ -340,7 +340,7 @@
static RegisterBoolNode<ComparativeBoolNode> regComparativeBoolNodeMatching2(blr_matching2); // sleuth
ComparativeBoolNode::ComparativeBoolNode(MemoryPool& pool, UCHAR aBlrOp,
- dsql_nod* aArg1, dsql_nod* aArg2, dsql_nod* aArg3)
+ ValueExprNode* aArg1, ExprNode* aArg2, ValueExprNode* aArg3)
: TypedNode<BoolExprNode, ExprNode::TYPE_COMPARATIVE_BOOL>(pool),
blrOp(aBlrOp),
dsqlArg1(aArg1),
@@ -380,17 +380,17 @@
return node;
}
-void ComparativeBoolNode::print(string& text, Array<dsql_nod*>& nodes) const
+void ComparativeBoolNode::print(string& text) const
{
text.printf("ComparativeBoolNode (%d)", blrOp);
- BoolExprNode::print(text, nodes);
+ BoolExprNode::print(text);
}
BoolExprNode* ComparativeBoolNode::dsqlPass(DsqlCompilerScratch* dsqlScratch)
{
- dsql_nod* procArg1 = dsqlArg1;
- dsql_nod* procArg2 = dsqlArg2;
- dsql_nod* procArg3 = dsqlArg3;
+ ValueExprNode* procArg1 = dsqlArg1;
+ ExprNode* procArg2 = dsqlArg2;
+ ValueExprNode* procArg3 = dsqlArg3;
FieldNode* fieldNode1;
// Make INSERTING/UPDATING/DELETING in booleans to read the trigger action.
@@ -407,27 +407,23 @@
{
if (fieldNode1->dsqlName == NAMES[i])
{
- thread_db* tdbb = JRD_get_thread_data();
-
- InternalInfoNode* infoNode = FB_NEW(*tdbb->getDefaultPool()) InternalInfoNode(
- *tdbb->getDefaultPool(), MAKE_const_slong(INFO_TYPE_TRIGGER_ACTION));
-
- procArg1 = MAKE_node(Dsql::nod_class_exprnode, 1);
- procArg1->nod_arg[0] = reinterpret_cast<dsql_nod*>(infoNode);
-
+ procArg1 = FB_NEW(getPool()) InternalInfoNode(getPool(),
+ MAKE_const_slong(INFO_TYPE_TRIGGER_ACTION));
procArg2 = MAKE_const_slong(i + 1);
}
}
}
- if (procArg2->nod_type == Dsql::nod_list)
+ ValueListNode* listNode = procArg2->as<ValueListNode>();
+ if (listNode)
{
int listItemCount = 0;
BoolExprNode* resultNode = NULL;
- dsql_nod** ptr = procArg2->nod_arg;
+ ValueExprNode** ptr = listNode->dsqlArgs.begin();
- for (const dsql_nod* const* const end = ptr + procArg2->nod_count;
- ptr != end; ++listItemCount, ++ptr)
+ for (const ValueExprNode* const* const end = listNode->dsqlArgs.end();
+ ptr != end;
+ ++listItemCount, ++ptr)
{
if (listItemCount >= MAX_MEMBER_LIST)
{
@@ -436,33 +432,15 @@
Arg::Gds(isc_dsql_too_many_values) << Arg::Num(MAX_MEMBER_LIST));
}
- DEV_BLKCHK(*ptr, dsql_type_nod);
-
ComparativeBoolNode* temp = FB_NEW(getPool()) ComparativeBoolNode(getPool(),
blrOp, procArg1, *ptr);
-
- if (resultNode)
- {
- dsql_nod* tempNod = MAKE_node(Dsql::nod_class_exprnode, 1);
- tempNod->nod_arg[0] = reinterpret_cast<dsql_nod*>(temp);
-
- dsql_nod* resultNod = MAKE_node(Dsql::nod_class_exprnode, 1);
- resultNod->nod_arg[0] = reinterpret_cast<dsql_nod*>(resultNode);
-
- BinaryBoolNode* binaryNode = FB_NEW(getPool()) BinaryBoolNode(getPool(),
- blr_or, resultNod, tempNod);
-
- resultNode = binaryNode;
- }
- else
- resultNode = temp;
+ resultNode = PASS1_compose(resultNode, temp, blr_or);
}
return resultNode->dsqlPass(dsqlScratch);
}
- SelectExprNode* selNode = ExprNode::as<SelectExprNode>(procArg2);
-
+ SelectExprNode* selNode = procArg2->as<SelectExprNode>();
if (selNode)
{
fb_assert(!(selNode->dsqlFlags & RecordSourceNode::DFLAG_SINGLETON));
@@ -476,9 +454,14 @@
return createRseNode(dsqlScratch, newBlrOp);
}
+ fb_assert(procArg2->kind == KIND_VALUE);
+ ValueExprNode* valueNode = static_cast<ValueExprNode*>(procArg2);
+ valueNode = doDsqlPass(dsqlScratch, valueNode);
+
ComparativeBoolNode* node = FB_NEW(getPool()) ComparativeBoolNode(getPool(), blrOp,
- PASS1_node(dsqlScratch, procArg1), PASS1_node(dsqlScratch, procArg2),
- PASS1_node(dsqlScratch, procArg3));
+ doDsqlPass(dsqlScratch, procArg1),
+ valueNode,
+ doDsqlPass(dsqlScratch, procArg3));
switch (blrOp)
{
@@ -492,24 +475,24 @@
case blr_between:
{
// Try to force arg1 to be same type as arg2 eg: ? = FIELD case
- PASS1_set_parameter_type(dsqlScratch, node->dsqlArg1, node->dsqlArg2, false);
+ PASS1_set_parameter_type(dsqlScratch, node->dsqlArg1, valueNode, false);
// Try to force arg2 to be same type as arg1 eg: FIELD = ? case
// Try even when the above call succeeded, because "arg2" may
// have arg-expressions that should be resolved.
- PASS1_set_parameter_type(dsqlScratch, node->dsqlArg2, node->dsqlArg1, false);
+ PASS1_set_parameter_type(dsqlScratch, valueNode, node->dsqlArg1, false);
// X BETWEEN Y AND ? case
if (!PASS1_set_parameter_type(dsqlScratch, node->dsqlArg3, node->dsqlArg1, false))
{
// ? BETWEEN Y AND ? case
- PASS1_set_parameter_type(dsqlScratch, node->dsqlArg3, node->dsqlArg2, false);
+ PASS1_set_parameter_type(dsqlScratch, node->dsqlArg3, valueNode, false);
}
dsc desc1, desc2;
MAKE_desc(dsqlScratch, &desc1, node->dsqlArg1);
- MAKE_desc(dsqlScratch, &desc2, node->dsqlArg2);
+ MAKE_desc(dsqlScratch, &desc2, valueNode);
if ((desc1.dsc_dtype == dtype_boolean || desc2.dsc_dtype == dtype_boolean) &&
!(desc1.isNull() || desc2.isNull()) && desc1.dsc_dtype != desc2.dsc_dtype)
@@ -526,15 +509,15 @@
case blr_similar:
case blr_starting:
// Try to force arg1 to be same type as arg2 eg: ? LIKE FIELD case
- PASS1_set_parameter_type(dsqlScratch, node->dsqlArg1, node->dsqlArg2, true);
+ PASS1_set_parameter_type(dsqlScratch, node->dsqlArg1, valueNode, true);
// Try to force arg2 same type as arg 1 eg: FIELD LIKE ? case
// Try even when the above call succeeded, because "arg2" may
// have arg-expressions that should be resolved.
- PASS1_set_parameter_type(dsqlScratch, node->dsqlArg2, node->dsqlArg1, true);
+ PASS1_set_parameter_type(dsqlScratch, valueNode, node->dsqlArg1, true);
// X LIKE Y ESCAPE ? case
- PASS1_set_parameter_type(dsqlScratch, node->dsqlArg3, node->dsqlArg2, true);
+ PASS1_set_parameter_type(dsqlScratch, node->dsqlArg3, valueNode, true);
}
return node;
@@ -1327,35 +1310,28 @@
SelectExprNode* dt = FB_NEW(getPool()) SelectExprNode(getPool());
// Ignore validation for column names that must exist for "user" derived tables.
dt->dsqlFlags = RecordSourceNode::DFLAG_DT_IGNORE_COLUMN_CHECK | RecordSourceNode::DFLAG_DERIVED;
- dt->querySpec = dsqlArg2;
- dsql_nod* from = MAKE_node(Dsql::nod_list, 1);
- from->nod_arg[0] = MAKE_class_node(dt);
+ dt->querySpec = static_cast<RecordSourceNode*>(dsqlArg2);
RseNode* querySpec = FB_NEW(getPool()) RseNode(getPool());
- querySpec->dsqlFrom = from;
+ querySpec->dsqlFrom = FB_NEW(getPool()) RecSourceListNode(getPool(), 1);
+ querySpec->dsqlFrom->dsqlArgs[0] = dt;
SelectExprNode* select_expr = FB_NEW(getPool()) SelectExprNode(getPool());
- select_expr->querySpec = MAKE_class_node(querySpec);
+ select_expr->querySpec = querySpec;
const DsqlContextStack::iterator base(*dsqlScratch->context);
const DsqlContextStack::iterator baseDT(dsqlScratch->derivedContext);
const DsqlContextStack::iterator baseUnion(dsqlScratch->unionContext);
- dsql_nod* rseNod = PASS1_rse(dsqlScratch, MAKE_class_node(select_expr), NULL);
- RseNode* rse = ExprNode::as<RseNode>(rseNod);
- fb_assert(rse);
+ RseNode* rse = PASS1_rse(dsqlScratch, select_expr, NULL);
// Create a conjunct to be injected.
- ComparativeBoolNode* cmpNode = FB_NEW(getPool()) ComparativeBoolNode(getPool(), blrOp,
- PASS1_node_psql(dsqlScratch, dsqlArg1, false), rse->dsqlSelectList->nod_arg[0]);
+ rse->dsqlWhere = FB_NEW(getPool()) ComparativeBoolNode(getPool(), blrOp,
+ doDsqlPass(dsqlScratch, dsqlArg1, false), rse->dsqlSelectList->dsqlArgs[0]);
- dsql_nod* temp = MAKE_node(Dsql::nod_class_exprnode, 1);
- temp->nod_arg[0] = reinterpret_cast<dsql_nod*>(cmpNode);
- rse->dsqlWhere = temp;
-
// Create output node.
- RseBoolNode* rseBoolNode = FB_NEW(getPool()) RseBoolNode(getPool(), rseBlrOp, rseNod);
+ RseBoolNode* rseBoolNode = FB_NEW(getPool()) RseBoolNode(getPool(), rseBlrOp, rse);
// Finish off by cleaning up contexts
dsqlScratch->unionContext.clear(baseUnion);
@@ -1371,7 +1347,7 @@
static RegisterBoolNode<MissingBoolNode> regMissingBoolNode(blr_missing);
-MissingBoolNode::MissingBoolNode(MemoryPool& pool, dsql_nod* aArg, bool aDsqlUnknown)
+MissingBoolNode::MissingBoolNode(MemoryPool& pool, ValueExprNode* aArg, bool aDsqlUnknown)
: TypedNode<BoolExprNode, ExprNode::TYPE_MISSING_BOOL>(pool),
dsqlArg(aArg),
dsqlUnknown(aDsqlUnknown),
@@ -1387,18 +1363,18 @@
return node;
}
-void MissingBoolNode::print(string& text, Array<dsql_nod*>& nodes) const
+void MissingBoolNode::print(string& text) const
{
text = "MissingBoolNode";
- BoolExprNode::print(text, nodes);
+ BoolExprNode::print(text);
}
BoolExprNode* MissingBoolNode::dsqlPass(DsqlCompilerScratch* dsqlScratch)
{
MissingBoolNode* node = FB_NEW(getPool()) MissingBoolNode(getPool(),
- PASS1_node(dsqlScratch, dsqlArg));
+ doDsqlPass(dsqlScratch, dsqlArg));
- PASS1_set_parameter_type(dsqlScratch, node->dsqlArg, NULL, false);
+ PASS1_set_parameter_type(dsqlScratch, node->dsqlArg, (dsc*) NULL, false);
dsc desc;
MAKE_desc(dsqlScratch, &desc, node->dsqlArg);
@@ -1463,7 +1439,7 @@
static RegisterBoolNode<NotBoolNode> regNotBoolNode(blr_not);
-NotBoolNode::NotBoolNode(MemoryPool& pool, dsql_nod* aArg)
+NotBoolNode::NotBoolNode(MemoryPool& pool, BoolExprNode* aArg)
: TypedNode<BoolExprNode, ExprNode::TYPE_NOT_BOOL>(pool),
dsqlArg(aArg),
arg(NULL)
@@ -1478,10 +1454,10 @@
return node;
}
-void NotBoolNode::print(string& text, Array<dsql_nod*>& nodes) const
+void NotBoolNode::print(string& text) const
{
text = "NotBoolNode";
- BoolExprNode::print(text, nodes);
+ BoolExprNode::print(text);
}
BoolExprNode* NotBoolNode::dsqlPass(DsqlCompilerScratch* dsqlScratch)
@@ -1532,9 +1508,6 @@
// Get rid of redundant nested NOT predicates.
BoolExprNode* NotBoolNode::process(DsqlCompilerScratch* dsqlScratch, bool invert)
{
- fb_assert(dsqlArg->nod_type == Dsql::nod_class_exprnode);
- BoolExprNode* boolArg = reinterpret_cast<BoolExprNode*>(dsqlArg->nod_arg[0]);
-
NotBoolNode* notArg = ExprNode::as<NotBoolNode>(dsqlArg);
if (notArg)
@@ -1544,14 +1517,14 @@
}
if (!invert)
- return boolArg->dsqlPass(dsqlScratch);
+ return dsqlArg->dsqlPass(dsqlScratch);
ComparativeBoolNode* cmpArg = ExprNode::as<ComparativeBoolNode>(dsqlArg);
BinaryBoolNode* binArg = ExprNode::as<BinaryBoolNode>(dsqlArg);
// Do not handle special case: <value> NOT IN <list>
- if (cmpArg && cmpArg->dsqlArg2->nod_type != Dsql::nod_list)
+ if (cmpArg && !cmpArg->dsqlArg2->is<ValueListNode>())
{
// Invert the given boolean.
switch (cmpArg->blrOp)
@@ -1604,17 +1577,15 @@
case blr_between:
{
- BinaryBoolNode* node = FB_NEW(getPool()) BinaryBoolNode(getPool(), blr_or,
- MAKE_node(Dsql::nod_class_exprnode, 1), MAKE_node(Dsql::nod_class_exprnode, 1));
-
- ComparativeBoolNode* cmpNode = FB_NEW(getPool()) ComparativeBoolNode(getPool(),
+ ComparativeBoolNode* cmpNode1 = FB_NEW(getPool()) ComparativeBoolNode(getPool(),
blr_lss, cmpArg->dsqlArg1, cmpArg->dsqlArg2);
- node->dsqlArg1->nod_arg[0] = reinterpret_cast<dsql_nod*>(cmpNode);
- cmpNode = FB_NEW(getPool()) ComparativeBoolNode(getPool(),
+ ComparativeBoolNode* cmpNode2 = FB_NEW(getPool()) ComparativeBoolNode(getPool(),
blr_gtr, cmpArg->dsqlArg1, cmpArg->dsqlArg3);
- node->dsqlArg2->nod_arg[0] = reinterpret_cast<dsql_nod*>(cmpNode);
+ BinaryBoolNode* node = FB_NEW(getPool()) BinaryBoolNode(getPool(), blr_or,
+ cmpNode1, cmpNode2);
+
return node->dsqlPass(dsqlScratch);
}
}
@@ -1628,15 +1599,12 @@
{
UCHAR newBlrOp = binArg->blrOp == blr_and ? blr_or : blr_and;
+ NotBoolNode* notNode1 = FB_NEW(getPool()) NotBoolNode(getPool(), binArg->dsqlArg1);
+ NotBoolNode* notNode2 = FB_NEW(getPool()) NotBoolNode(getPool(), binArg->dsqlArg2);
+
BinaryBoolNode* node = FB_NEW(getPool()) BinaryBoolNode(getPool(), newBlrOp,
- MAKE_node(Dsql::nod_class_exprnode, 1), MAKE_node(Dsql::nod_class_exprnode, 1));
+ notNode1, notNode2);
- NotBoolNode* notNode = FB_NEW(getPool()) NotBoolNode(getPool(), binArg->dsqlArg1);
- node->dsqlArg1->nod_arg[0] = reinterpret_cast<dsql_nod*>(notNode);
-
- notNode = FB_NEW(getPool()) NotBoolNode(getPool(), binArg->dsqlArg2);
- node->dsqlArg2->nod_arg[0] = reinterpret_cast<dsql_nod*>(notNode);
-
return node->dsqlPass(dsqlScratch);
}
}
@@ -1645,7 +1613,7 @@
// No inversion is possible, so just recreate the input node
// and return immediately to avoid infinite recursion later.
- return FB_NEW(getPool()) NotBoolNode(getPool(), PASS1_node(dsqlScratch, dsqlArg));
+ return FB_NEW(getPool()) NotBoolNode(getPool(), doDsqlPass(dsqlScratch, dsqlArg));
}
@@ -1658,7 +1626,7 @@
static RegisterBoolNode<RseBoolNode> regRseBoolNodeAnsiAll(blr_ansi_all);
static RegisterBoolNode<RseBoolNode> regRseBoolNodeExists(blr_exists); // ASF: Where is this handled?
-RseBoolNode::RseBoolNode(MemoryPool& pool, UCHAR aBlrOp, dsql_nod* aDsqlRse)
+RseBoolNode::RseBoolNode(MemoryPool& pool, UCHAR aBlrOp, RecordSourceNode* aDsqlRse)
: TypedNode<BoolExprNode, ExprNode::TYPE_RSE_BOOL>(pool),
blrOp(aBlrOp),
dsqlRse(aDsqlRse),
@@ -1675,10 +1643,10 @@
return node;
}
-void RseBoolNode::print(string& text, Array<dsql_nod*>& nodes) const
+void RseBoolNode::print(string& text) const
{
text.printf("RseBoolNode (%d)", blrOp);
- BoolExprNode::print(text, nodes);
+ BoolExprNode::print(text);
}
BoolExprNode* RseBoolNode::dsqlPass(DsqlCompilerScratch* dsqlScratch)
@@ -1686,7 +1654,7 @@
const DsqlContextStack::iterator base(*dsqlScratch->context);
RseBoolNode* node = FB_NEW(getPool()) RseBoolNode(getPool(), blrOp,
- PASS1_rse(dsqlScratch, dsqlRse, NULL));
+ PASS1_rse(dsqlScratch, dsqlRse->as<SelectExprNode>(), NULL));
// Finish off by cleaning up contexts
dsqlScratch->context->clear(base);
@@ -1697,7 +1665,7 @@
void RseBoolNode::genBlr(DsqlCompilerScratch* dsqlScratch)
{
dsqlScratch->appendUChar(blrOp);
- GEN_rse(dsqlScratch, dsqlRse);
+ GEN_rse(dsqlScratch, dsqlRse->as<RseNode>());
}
bool RseBoolNode::dsqlMatch(const ExprNode* other, bool ignoreMapCast) const
Modified: firebird/trunk/src/dsql/BoolNodes.h
===================================================================
--- firebird/trunk/src/dsql/BoolNodes.h 2012-04-24 07:03:15 UTC (rev 54401)
+++ firebird/trunk/src/dsql/BoolNodes.h 2012-04-25 01:42:47 UTC (rev 54402)
@@ -34,11 +34,12 @@
class BinaryBoolNode : public TypedNode<BoolExprNode, ExprNode::TYPE_BINARY_BOOL>
{
public:
- BinaryBoolNode(MemoryPool& pool, UCHAR aBlrOp, dsql_nod* aArg1 = NULL, dsql_nod* aArg2 = NULL);
+ BinaryBoolNode(MemoryPool& pool, UCHAR aBlrOp, BoolExprNode* aArg1 = NULL,
+ BoolExprNode* aArg2 = NULL);
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
- virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
+ virtual void print(Firebird::string& text) const;
virtual BoolExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
@@ -53,8 +54,8 @@
public:
UCHAR blrOp;
- dsql_nod* dsqlArg1;
- dsql_nod* dsqlArg2;
+ BoolExprNode* dsqlArg1;
+ BoolExprNode* dsqlArg2;
NestConst<BoolExprNode> arg1;
NestConst<BoolExprNode> arg2;
};
@@ -70,12 +71,12 @@
DFLAG_ANSI_ANY
};
- ComparativeBoolNode(MemoryPool& pool, UCHAR aBlrOp, dsql_nod* aArg1 = NULL,
- dsql_nod* aArg2 = NULL, dsql_nod* aArg3 = NULL);
+ ComparativeBoolNode(MemoryPool& pool, UCHAR aBlrOp, ValueExprNode* aArg1 = NULL,
+ ExprNode* aArg2 = NULL, ValueExprNode* aArg3 = NULL);
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
- virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
+ virtual void print(Firebird::string& text) const;
virtual BoolExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
@@ -103,9 +104,9 @@
public:
UCHAR blrOp;
- dsql_nod* dsqlArg1;
- dsql_nod* dsqlArg2;
- dsql_nod* dsqlArg3;
+ ValueExprNode* dsqlArg1;
+ ExprNode* dsqlArg2;
+ ValueExprNode* dsqlArg3;
DsqlFlag dsqlFlag;
bool dsqlWasValue;
NestConst<ValueExprNode> arg1;
@@ -118,11 +119,11 @@
class MissingBoolNode : public TypedNode<BoolExprNode, ExprNode::TYPE_MISSING_BOOL>
{
public:
- explicit MissingBoolNode(MemoryPool& pool, dsql_nod* aArg = NULL, bool aDsqlUnknown = false);
+ explicit MissingBoolNode(MemoryPool& pool, ValueExprNode* aArg = NULL, bool aDsqlUnknown = false);
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
- virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
+ virtual void print(Firebird::string& text) const;
virtual BoolExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
@@ -137,7 +138,7 @@
virtual bool execute(thread_db* tdbb, jrd_req* request) const;
public:
- dsql_nod* dsqlArg;
+ ValueExprNode* dsqlArg;
bool dsqlUnknown;
NestConst<ValueExprNode> arg;
};
@@ -146,11 +147,11 @@
class NotBoolNode : public TypedNode<BoolExprNode, ExprNode::TYPE_NOT_BOOL>
{
public:
- explicit NotBoolNode(MemoryPool& pool, dsql_nod* aArg = NULL);
+ explicit NotBoolNode(MemoryPool& pool, BoolExprNode* aArg = NULL);
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
- virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
+ virtual void print(Firebird::string& text) const;
virtual BoolExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
@@ -167,7 +168,7 @@
BoolExprNode* process(DsqlCompilerScratch* dsqlScratch, bool invert);
public:
- dsql_nod* dsqlArg;
+ BoolExprNode* dsqlArg;
NestConst<BoolExprNode> arg;
};
@@ -175,18 +176,18 @@
class RseBoolNode : public TypedNode<BoolExprNode, ExprNode::TYPE_RSE_BOOL>
{
public:
- RseBoolNode(MemoryPool& pool, UCHAR aBlrOp, dsql_nod* aDsqlRse = NULL);
+ RseBoolNode(MemoryPool& pool, UCHAR aBlrOp, RecordSourceNode* aDsqlRse = NULL);
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
- virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
+ virtual void print(Firebird::string& text) const;
virtual BoolExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
virtual bool dsqlAggregateFinder(AggregateFinder& visitor)
{
fb_assert(blrOp != blr_any && blrOp != blr_ansi_any && blrOp != blr_ansi_all);
- return visitor.ignoreSubSelects ? false : BoolExprNode::dsqlVisit(visitor);
+ return visitor.ignoreSubSelects ? false : BoolExprNode::dsqlAggregateFinder(visitor);
}
virtual bool jrdPossibleUnknownFinder()
@@ -207,7 +208,7 @@
public:
UCHAR blrOp;
- dsql_nod* dsqlRse;
+ RecordSourceNode* dsqlRse;
NestConst<RseNode> rse;
NestConst<RecordSource> rsb;
};
Modified: firebird/trunk/src/dsql/DdlNodes.epp
===================================================================
--- firebird/trunk/src/dsql/DdlNodes.epp 2012-04-24 07:03:15 UTC (rev 54401)
+++ firebird/trunk/src/dsql/DdlNodes.epp 2012-04-25 01:42:47 UTC (rev 54402)
@@ -24,7 +24,6 @@
#include "../dsql/BoolNodes.h"
#include "../dsql/ExprNodes.h"
#include "../dsql/StmtNodes.h"
-#include "../dsql/node.h"
#include "../jrd/blr.h"
#include "../jrd/btr.h"
#include "../jrd/dyn.h"
@@ -84,7 +83,6 @@
namespace Jrd {
using namespace Firebird;
-using namespace Dsql;
static void checkForeignKeyTempScope(thread_db* tdbb, jrd_tra* transaction,
const MetaName& childRelName, const MetaName& masterIndexName);
@@ -93,8 +91,8 @@
static void checkViewDependency(thread_db* tdbb, jrd_tra* transaction,
const MetaName& relationName, const MetaName& fieldName);
static void clearPermanentField(dsql_rel* relation, bool permanent);
-static void defineComputed(DsqlCompilerScratch* dsqlScratch, dsql_nod* relation, dsql_fld* field,
- const ValueSourceClause* clause, string& source, BlrWriter::BlrData& value);
+static void defineComputed(DsqlCompilerScratch* dsqlScratch, RelationSourceNode* relation,
+ dsql_fld* field, const ValueSourceClause* clause, string& source, BlrWriter::BlrData& value);
static void deleteKeyConstraint(thread_db* tdbb, jrd_tra* transaction,
const MetaName& relationName, const MetaName& constraintName, const MetaName& indexName);
static void defineFile(thread_db* tdbb, jrd_tra* transaction, SLONG shadowNumber, bool manualShadow,
@@ -292,7 +290,7 @@
}
// Define a COMPUTED BY clause, for a field or an index.
-void defineComputed(DsqlCompilerScratch* dsqlScratch, dsql_nod* relation, dsql_fld* field,
+void defineComputed(DsqlCompilerScratch* dsqlScratch, RelationSourceNode* relation, dsql_fld* field,
const ValueSourceClause* clause, string& source, BlrWriter::BlrData& value)
{
// Get the table node and set up correct context.
@@ -319,7 +317,7 @@
PASS1_make_context(dsqlScratch, relation);
- dsql_nod* input = PASS1_node(dsqlScratch, clause->value);
+ ValueExprNode* input = Node::doDsqlPass(dsqlScratch, clause->value);
// Try to calculate size of the computed field. The calculated size
// may be ignored, but it will catch self references.
@@ -824,8 +822,8 @@
Attachment* const attachment = transaction->tra_attachment;
const string& userName = attachment->att_user->usr_user_name;
- const dsql_nod* elements = field.legacyField->fld_ranges;
- const USHORT dims = elements ? elements->nod_count / 2 : 0;
+ const ValueListNode* elements = field.legacyField->fld_ranges;
+ const USHORT dims = elements ? elements->dsqlArgs.getCount() / 2 : 0;
if (dims > MAX_ARRAY_DIMENSIONS)
{
@@ -890,13 +888,15 @@
requestHandle.reset(tdbb, drq_s_fld_dym, DYN_REQUESTS);
SSHORT position = 0;
- const dsql_nod* const* ptr = elements->nod_arg;
- for (const dsql_nod* const* const end = ptr + elements->nod_count; ptr < end; ++ptr, ++position)
+ const ValueExprNode* const* ptr = elements->dsqlArgs.begin();
+ for (const ValueExprNode* const* const end = elements->dsqlArgs.end();
+ ptr != end;
+ ++ptr, ++position)
{
- const dsql_nod* element = *ptr++;
- const SLONG lrange = ExprNode::as<LiteralNode>(element)->getSlong();
+ const ValueExprNode* element = *ptr++;
+ const SLONG lrange = element->as<LiteralNode>()->getSlong();
element = *ptr;
- const SLONG hrange = ExprNode::as<LiteralNode>(element)->getSlong();
+ const SLONG hrange = element->as<LiteralNode>()->getSlong();
if (lrange >= hrange)
{
@@ -975,11 +975,11 @@
ParameterClause::ParameterClause(MemoryPool& pool, dsql_fld* field, const MetaName& aCollate,
- ValueSourceClause* aDefaultClause, dsql_nod* aLegacyParameter)
+ ValueSourceClause* aDefaultClause, ValueExprNode* aParameterExpr)
: TypeClause(pool, field, aCollate),
name(pool, field ? field->fld_name : ""),
defaultClause(aDefaultClause),
- legacyParameter(aLegacyParameter)
+ parameterExpr(aParameterExpr)
{
}
@@ -994,7 +994,7 @@
//----------------------
-void AlterCharSetNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void AlterCharSetNode::print(string& text) const
{
text.printf(
"AlterCharSetNode\n"
@@ -1061,7 +1061,7 @@
//----------------------
-void CommentOnNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void CommentOnNode::print(string& text) const
{
text.printf(
"CommentOnNode\n"
@@ -1301,7 +1301,7 @@
//----------------------
-void CreateAlterFunctionNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void CreateAlterFunctionNode::print(string& text) const
{
text.printf(
"CreateAlterFunctionNode\n"
@@ -1378,7 +1378,7 @@
if (parameter.defaultClause)
{
hasDefaultParams = true;
- parameter.defaultClause->value = PASS1_node(dsqlScratch, parameter.defaultClause->value);
+ parameter.defaultClause->value = doDsqlPass(dsqlScratch, parameter.defaultClause->value);
}
else if (hasDefaultParams)
{
@@ -2004,7 +2004,7 @@
//----------------------
-void AlterExternalFunctionNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void AlterExternalFunctionNode::print(string& text) const
{
text.printf(
"AlterExternalFunctionNode\n"
@@ -2117,7 +2117,7 @@
END_FOR
}
-void DropFunctionNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void DropFunctionNode::print(string& text) const
{
text.printf(
"DropFunctionNode\n"
@@ -2202,7 +2202,7 @@
//----------------------
-void CreateAlterProcedureNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void CreateAlterProcedureNode::print(string& text) const
{
text.printf(
"CreateAlterProcedureNode\n"
@@ -2296,7 +2296,7 @@
if (parameter.defaultClause)
{
hasDefaultParams = true;
- parameter.defaultClause->value = PASS1_node(dsqlScratch, parameter.defaultClause->value);
+ parameter.defaultClause->value = doDsqlPass(dsqlScratch, parameter.defaultClause->value);
}
else if (hasDefaultParams)
{
@@ -2842,7 +2842,7 @@
END_FOR
}
-void DropProcedureNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void DropProcedureNode::print(string& text) const
{
text.printf(
"DropProcedureNode\n"
@@ -3069,7 +3069,7 @@
//----------------------
-void CreateAlterTriggerNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void CreateAlterTriggerNode::print(string& text) const
{
text.printf(
"CreateAlterTriggerNode\n"
@@ -3201,16 +3201,12 @@
RelationSourceNode* relationNode = FB_NEW(getPool()) RelationSourceNode(getPool(),
relationName);
- dsql_nod* relationNod = MAKE_node(nod_class_exprnode, 1);
- ///trigger_node->nod_arg[e_trg_table] = relationNod;
- relationNod->nod_arg[0] = reinterpret_cast<dsql_nod*>(relationNode);
-
const string temp = relationNode->alias; // always empty?
if (hasOldContext(type.value))
{
relationNode->alias = OLD_CONTEXT;
- dsql_ctx* oldContext = PASS1_make_context(dsqlScratch, relationNod);
+ dsql_ctx* oldContext = PASS1_make_context(dsqlScratch, relationNode);
oldContext->ctx_flags |= CTX_system;
}
else
@@ -3219,7 +3215,7 @@
if (hasNewContext(type.value))
{
relationNode->alias = NEW_CONTEXT;
- dsql_ctx* newContext = PASS1_make_context(dsqlScratch, relationNod);
+ dsql_ctx* newContext = PASS1_make_context(dsqlScratch, relationNode);
newContext->ctx_flags |= CTX_system;
}
else
@@ -3272,7 +3268,7 @@
//----------------------
-void DropTriggerNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void DropTriggerNode::print(string& text) const
{
text.printf(
"DropTriggerNode\n"
@@ -3398,7 +3394,7 @@
//----------------------
-void CreateCollationNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void CreateCollationNode::print(string& text) const
{
text.printf(
"CreateCollationNode\n"
@@ -3616,7 +3612,7 @@
//----------------------
-void DropCollationNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void DropCollationNode::print(string& text) const
{
text.printf(
"DropCollationNode\n"
@@ -3763,7 +3759,7 @@
//----------------------
-void CreateDomainNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void CreateDomainNode::print(string& text) const
{
string nameTypeStr;
nameType.print(nameTypeStr);
@@ -3785,8 +3781,8 @@
Arg::Gds(isc_dsql_implicit_domain_name) << nameType.name);
}
- const dsql_nod* elements = nameType.legacyField->fld_ranges;
- const USHORT dims = elements ? elements->nod_count / 2 : 0;
+ const ValueListNode* elements = nameType.legacyField->fld_ranges;
+ const USHORT dims = elements ? elements->dsqlArgs.getCount() / 2 : 0;
if (nameType.defaultClause && dims != 0)
{
@@ -3826,7 +3822,7 @@
dsqlScratch->getBlrData().clear();
dsqlScratch->appendUChar(dsqlScratch->isVersion4() ? blr_version4 : blr_version5);
- dsql_nod* node = PASS1_node(dsqlScratch, nameType.defaultClause->value);
+ ValueExprNode* node = doDsqlPass(dsqlScratch, nameType.defaultClause->value);
GEN_expr(dsqlScratch, node);
@@ -3854,7 +3850,7 @@
// -- chrisj 1999-08-20
++dsqlScratch->contextNumber;
- dsql_nod* node = PASS1_node(dsqlScratch, check->value);
+ BoolExprNode* node = doDsqlPass(dsqlScratch, check->value);
GEN_expr(dsqlScratch, node);
@@ -4304,7 +4300,7 @@
END_FOR
}
-void AlterDomainNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void AlterDomainNode::print(string& text) const
{
text.printf(
"AlterDomainNode\n"
@@ -4383,7 +4379,7 @@
// -- chrisj 1999-08-20
++dsqlScratch->contextNumber;
- dsql_nod* node = PASS1_node(dsqlScratch, setConstraint->value);
+ BoolExprNode* node = doDsqlPass(dsqlScratch, setConstraint->value);
GEN_expr(dsqlScratch, node);
@@ -4409,7 +4405,7 @@
dsqlScratch->getBlrData().clear();
dsqlScratch->appendUChar(dsqlScratch->isVersion4() ? blr_version4 : blr_version5);
- dsql_nod* node = PASS1_node(dsqlScratch, setDefault->value);
+ ValueExprNode* node = doDsqlPass(dsqlScratch, setDefault->value);
GEN_expr(dsqlScratch, node);
@@ -4612,7 +4608,7 @@
return found;
}
-void DropDomainNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void DropDomainNode::print(string& text) const
{
text.printf(
"DropDomainNode\n"
@@ -4731,7 +4727,7 @@
//----------------------
-void CreateAlterExceptionNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void CreateAlterExceptionNode::print(string& text) const
{
text.printf(
"CreateAlterExceptionNode\n"
@@ -4857,7 +4853,7 @@
//----------------------
-void DropExceptionNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void DropExceptionNode::print(string& text) const
{
text.printf(
"DropExceptionNode\n"
@@ -4915,7 +4911,7 @@
//----------------------
-void CreateSequenceNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void CreateSequenceNode::print(string& text) const
{
text.printf(
"CreateSequenceNode\n"
@@ -4989,7 +4985,7 @@
//----------------------
-void DropSequenceNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void DropSequenceNode::print(string& text) const
{
text.printf(
"DropSequenceNode\n"
@@ -5065,10 +5061,10 @@
//----------------------
-RelationNode::RelationNode(MemoryPool& p, dsql_nod* aDsqlNode)
+RelationNode::RelationNode(MemoryPool& p, RelationSourceNode* aDsqlNode)
: DdlNode(p),
dsqlNode(aDsqlNode),
- name(p, ExprNode::as<RelationSourceNode>(aDsqlNode)->dsqlName),
+ name(p, dsqlNode->dsqlName),
clauses(p)
{
}
@@ -5565,7 +5561,7 @@
bool RelationNode::defineDefault(thread_db* /*tdbb*/, DsqlCompilerScratch* dsqlScratch,
dsql_fld* /*field*/, const ValueSourceClause* clause, string& source, BlrWriter::BlrData& value)
{
- dsql_nod* input = PASS1_node(dsqlScratch, clause->value);
+ ValueExprNode* input = doDsqlPass(dsqlScratch, clause->value);
// Generate the blr expression.
@@ -5981,7 +5977,7 @@
// Generate triggers to implement the CHECK clause, either at the field or table level.
void RelationNode::defineCheckConstraint(DsqlCompilerScratch* dsqlScratch, Constraint& constraint,
- const ValueSourceClause* clause)
+ const BoolSourceClause* clause)
{
// Create the INSERT trigger.
defineCheckConstraintTrigger(dsqlScratch, constraint, clause, PRE_STORE_TRIGGER);
@@ -5992,7 +5988,7 @@
// Define a check constraint trigger.
void RelationNode::defineCheckConstraintTrigger(DsqlCompilerScratch* dsqlScratch,
- Constraint& constraint, const ValueSourceClause* clause, FB_UINT64 triggerType)
+ Constraint& constraint, const BoolSourceClause* clause, FB_UINT64 triggerType)
{
thread_db* tdbb = JRD_get_thread_data();
MemoryPool& pool = *tdbb->getDefaultPool();
@@ -6027,11 +6023,11 @@
// errors in pre_store and pre_modify triggers. Also, what sense can I make from NEW in
// pre_delete? However, we clash at JRD with "no current record for fetch operation".
- ExprNode::as<RelationSourceNode>(dsqlNode)->alias = OLD_CONTEXT;
+ dsqlNode->alias = OLD_CONTEXT;
dsql_ctx* oldContext = PASS1_make_context(dsqlScratch, dsqlNode);
oldContext->ctx_flags |= CTX_system;
- ExprNode::as<RelationSourceNode>(dsqlNode)->alias = NEW_CONTEXT;
+ dsqlNode->alias = NEW_CONTEXT;
dsql_ctx* newContext = PASS1_make_context(dsqlScratch, dsqlNode);
newContext->ctx_flags |= CTX_system;
@@ -6039,9 +6035,7 @@
NotBoolNode* notNode = FB_NEW(pool) NotBoolNode(pool, clause->value);
- dsql_nod* condition = MAKE_node(Dsql::nod_class_exprnode, 1);
- condition->nod_arg[0] = reinterpret_cast<dsql_nod*>(notNode);
- condition = PASS1_node(dsqlScratch, condition);
+ BoolExprNode* condition = notNode->dsqlPass(dsqlScratch);
dsqlScratch->appendUChar(blr_if);
GEN_expr(dsqlScratch, condition);
@@ -6422,7 +6416,7 @@
//----------------------
-void CreateRelationNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void CreateRelationNode::print(string& text) const
{
text.printf(
"CreateRelationNode\n"
@@ -6560,7 +6554,7 @@
//----------------------
-void AlterRelationNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void AlterRelationNode::print(string& text) const
{
text.printf(
"AlterRelationNode\n"
@@ -6575,15 +6569,17 @@
if (!dsqlScratch->relation)
{
- TEXT linecol[64];
- sprintf(linecol, "At line %d, column %d.",
- (int) dsqlNode->nod_line, (int) dsqlNode->nod_column);
+ //// TODO: <Missing arg #1 - possibly status vector overflow>
+ /***
+ char linecol[64];
+ sprintf(linecol, "At line %d, column %d.", (int) dsqlNode->line, (int) dsqlNode->column);
+ ***/
status_exception::raise(
Arg::Gds(isc_sqlerr) << Arg::Num(-204) <<
Arg::Gds(isc_dsql_relation_err) <<
- Arg::Gds(isc_random) << name <<
- Arg::Gds(isc_random) << linecol);
+ Arg::Gds(isc_random) << name /***<<
+ Arg::Gds(isc_random) << linecol***/);
}
// If there is an error, get rid of the cached data.
@@ -7201,7 +7197,7 @@
END_FOR
}
-void DropRelationNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void DropRelationNode::print(string& text) const
{
text.printf(
"DropRelationNode\n"
@@ -7429,7 +7425,7 @@
//----------------------
-void CreateAlterViewNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const
+void CreateAlterViewNode::print(string& text) const
{
text.printf(
"CreateAlterViewNode\n"
@@ -7477,7 +7473,7 @@
DDL_reset_context_stack(dsqlScratch);
++dsqlScratch->contextNumber;
- dsql_nod* rse = PASS1_rse(dsqlScratch, selectExpr, NULL);
+ RseNode* rse = PASS1_rse(dsqlScratch, selectExpr, NULL);
dsqlScratch->getBlrData().clear();
dsqlScratch->appendUChar(dsqlScratch->isVersion4() ? blr_version4 : blr_version5);
@@ -7645,33 +7641,33 @@
// SELECT. Otherwise use all the fields from the rse node that was created from the select
// expression.
- const dsql_nod* const* ptr = NULL;
- const dsql_nod* const* end = NULL;
+ const ValueExprNode* const* ptr = NULL;
+ const ValueExprNode* const* end = NULL;
if (viewFields)
{
- ptr = viewFields->nod_arg;
- end = ptr + viewFields->nod_count;
+ ptr = viewFields->dsqlArgs.begin();
+ end = viewFields->dsqlArgs.end();
}
// Go through the fields list, defining or modifying the local fields;
// If an expression is specified rather than a field, define a global
// field for the computed value as well.
- dsql_nod* items = ExprNode::as<RseNode>(rse)->dsqlSelectList;
- dsql_nod** itemsPtr = items->nod_arg;
+ ValueListNode* items = rse->dsqlSelectList;
+ ValueExprNode** itemsPtr = items->dsqlArgs.begin();
SortedArray<dsql_fld*> modifiedFields;
bool updatable = true;
SSHORT position = 0;
- for (const dsql_nod* const* const itemsEnd = itemsPtr + items->nod_count;
+ for (const ValueExprNode* const* const itemsEnd = items->dsqlArgs.end();
itemsPtr < itemsEnd; ++itemsPtr, ++position)
{
- dsql_nod* fieldNode = *itemsPtr;
+ ValueExprNode* fieldNode = *itemsPtr;
// Determine the proper field name, replacing the default if necessary.
- const dsql_nod* nameNode = fieldNode;
+ const ValueExprNode* nameNode = fieldNode;
const char* aliasName = NULL;
while (ExprNode::is<DsqlAliasNode>(nameNode) ||
@@ -7960,8 +7956,9 @@
Arg::Gds(isc_col_name_err));
}
- dsql_nod* querySpecNod = ExprNode::as<SelectExprNode>(selectExpr)->querySpec;
+ RecordSourceNode* querySpecNod = selectExpr->querySpec;
+#if 0 //// FIXME:
if (querySpecNod->nod_type == Dsql::nod_list)
{
// Only one table allowed for VIEW WITH CHECK OPTION
@@ -7970,11 +7967,12 @@
Arg::Gds(isc_dsql_command_err) <<
Arg::Gds(isc_table_view_err));
}
+#endif
RseNode* querySpec = ExprNode::as<RseNode>(querySpecNod);
fb_assert(querySpec);
- if (querySpec->dsqlFrom->nod_count != 1)
+ if (querySpec->dsqlFrom->dsqlArgs.getCount() != 1)
{
// Only one table allowed for VIEW WITH CHECK OPTION
status_exception::raise(
@@ -8017,7 +8015,7 @@
// Generate triggers to implement the WITH CHECK OPTION clause for a VIEW.
void CreateAlterViewNode::createCheckTriggers(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch,
- dsql_nod* items)
+ ValueListNode* items)
{
MemoryPool& pool = *tdbb->getDefaultPool();
@@ -8031,34 +8029,31 @@
// Create the UPDATE trigger.
- dsql_nod* baseAndNode = NULL;
- dsql_nod* baseRelation = NULL;
+ BoolExprNode* baseAndNode = NULL;
+ RelationSourceNode* baseRelation = NULL;
defineUpdateAction(dsqlScratch, &baseAndNode, &baseRelation, items);
fb_assert(baseAndNode);
fb_assert(baseRelation);
RseNode* rse = FB_NEW(pool) RseNode(pool);
rse->dsqlWhere = baseAndNode;
- rse->dsqlStreams = MAKE_node(Dsql::nod_list, 1);
- rse->dsqlStreams->nod_arg[0] = baseRelation;
+ rse->dsqlStreams = FB_NEW(pool) RecSourceListNode(pool, 1);
+ rse->dsqlStreams->dsqlArgs[0] = baseRelation;
- dsql_nod* rseNod = MAKE_node(Dsql::nod_class_exprnode, 1);
- rseNod->nod_arg[0] = reinterpret_cast<dsql_nod*>(rse);
-
- createCheckTrigger(tdbb, dsqlScratch, rseNod, items, actionNode, PRE_MODIFY_TRIGGER);
+ createCheckTrigger(tdbb, dsqlScratch, rse, items, actionNode, PRE_MODIFY_TRIGGER);
createCheckTrigger(tdbb, dsqlScratch, NULL, items, actionNode, PRE_STORE_TRIGGER);
}
// Define a trigger for a VIEW WITH CHECK OPTION.
void CreateAlterViewNode::createCheckTrigger(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch,
- dsql_nod* rse, dsql_nod* items, CompoundStmtNode* actions, TriggerType triggerType)
+ RseNode* rse, ValueListNode* items, CompoundStmtNode* actions, TriggerType triggerType)
{
MemoryPool& pool = *tdbb->getDefaultPool();
AutoSetRestore<bool> autoCheckConstraintTrigger(&dsqlScratch->checkConstraintTrigger, true);
- const dsql_nod* querySpecNod = ExprNode::as<SelectExprNode>(selectExpr)->querySpec;
- dsql_nod* relationNode = dsqlNode;
+ const RecordSourceNode* querySpecNod = selectExpr->querySpec;
+ RelationSourceNode* relationNode = dsqlNode;
// Generate the trigger blr.
@@ -8091,17 +8086,17 @@
DDL_reset_context_stack(dsqlScratch);
- string tempAlias = ExprNode::as<RelationSourceNode>(relationNode)->alias;
+ string tempAlias = relationNode->alias;
- ExprNode::as<RelationSourceNode>(relationNode)->alias = OLD_CONTEXT;
+ relationNode->alias = OLD_CONTEXT;
dsql_ctx* oldContext = PASS1_make_context(dsqlScratch, relationNode);
oldContext->ctx_flags |= CTX_system;
- ExprNode::as<RelationSourceNode>(relationNode)->alias = NEW_CONTEXT;
+ relationNode->alias = NEW_CONTEXT;
dsql_ctx* newContext = PASS1_make_context(dsqlScratch, relationNode);
newContext->ctx_flags |= CTX_system;
- ExprNode::as<RelationSourceNode>(relationNode)->alias = tempAlias;
+ relationNode->alias = tempAlias;
if (savContext)
{
@@ -8115,30 +8110,26 @@
const RseNode* querySpec = ExprNode::as<RseNode>(querySpecNod);
fb_assert(querySpec);
- dsql_nod* condition;
-
if (triggerType == PRE_MODIFY_TRIGGER)
{
dsqlScratch->appendUChar(blr_for);
- RseNode* rseNode = ExprNode::as<RseNode>(rse);
+ rse->dsqlStreams->dsqlArgs[0] = doDsqlPass(dsqlScratch, rse->dsqlStreams->dsqlArgs[0]);
+ rse->dsqlWhere = doDsqlPass(dsqlScratch, rse->dsqlWhere);
- rseNode->dsqlStreams->nod_arg[0] = PASS1_node(dsqlScratch, rseNode->dsqlStreams->nod_arg[0]);
- rseNode->dsqlWhere = PASS1_node(dsqlScratch, rseNode->dsqlWhere);
-
GEN_expr(dsqlScratch, rse);
- condition = replaceFieldNames(querySpec->dsqlWhere, items, viewFields, false, NEW_CONTEXT);
+ replaceFieldNames(querySpec->dsqlWhere, items, viewFields, false, NEW_CONTEXT);
}
else if (triggerType == PRE_STORE_TRIGGER)
- condition = replaceFieldNames(querySpec->dsqlWhere, items, viewFields, true, NEW_CONTEXT);
+ replaceFieldNames(querySpec->dsqlWhere, items, viewFields, true, NEW_CONTEXT);
else
- {
fb_assert(false);
- }
+ BoolExprNode* condition = querySpec->dsqlWhere;
+
dsqlScratch->appendUChar(blr_if);
- GEN_expr(dsqlScratch, PASS1_node(dsqlScratch, condition));
+ GEN_expr(dsqlScratch, doDsqlPass(dsqlScratch, condition));
dsqlScratch->appendUChar(blr_begin);
dsqlScratch->appendUChar(blr_end);
@@ -8165,7 +8156,7 @@
// Define an action statement which, given a view definition, will map an update to a record from
// a view of a single relation into the base relation.
void CreateAlterViewNode::defineUpdateAction(DsqlCompilerScratch* dsqlScratch,
- dsql_nod** ...
[truncated message content] |