2010-02-13 21:29:29 +01:00
|
|
|
/*
|
|
|
|
* The contents of this file are subject to the Initial
|
|
|
|
* Developer's Public License Version 1.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the
|
|
|
|
* License. You may obtain a copy of the License at
|
|
|
|
* http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
|
|
|
|
*
|
|
|
|
* Software distributed under the License is distributed AS IS,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing rights
|
|
|
|
* and limitations under the License.
|
|
|
|
*
|
|
|
|
* The Original Code was created by Adriano dos Santos Fernandes
|
|
|
|
* for the Firebird Open Source RDBMS project.
|
|
|
|
*
|
|
|
|
* Copyright (c) 2010 Adriano dos Santos Fernandes <adrianosf@gmail.com>
|
|
|
|
* and all contributors signed below.
|
|
|
|
*
|
|
|
|
* All Rights Reserved.
|
|
|
|
* Contributor(s): ______________________________________.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef DSQL_EXPR_NODES_H
|
|
|
|
#define DSQL_EXPR_NODES_H
|
|
|
|
|
2010-10-13 12:39:52 +02:00
|
|
|
#include "../common/common.h"
|
2010-02-13 21:29:29 +01:00
|
|
|
#include "../jrd/blr.h"
|
|
|
|
#include "../dsql/Nodes.h"
|
|
|
|
|
2010-04-05 20:43:11 +02:00
|
|
|
class SysFunction;
|
|
|
|
|
2010-02-13 21:29:29 +01:00
|
|
|
namespace Jrd {
|
|
|
|
|
2010-10-09 03:57:37 +02:00
|
|
|
struct ItemInfo;
|
2010-11-07 03:18:58 +01:00
|
|
|
class RecordSource;
|
2010-11-21 04:47:29 +01:00
|
|
|
class ValueListNode;
|
2010-10-09 03:57:37 +02:00
|
|
|
|
2010-02-13 21:29:29 +01:00
|
|
|
|
2010-09-17 05:15:32 +02:00
|
|
|
class ArithmeticNode : public TypedNode<ValueExprNode, ExprNode::TYPE_ARITHMETIC>
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
ArithmeticNode(MemoryPool& pool, UCHAR aBlrOp, bool aDialect1,
|
|
|
|
dsql_nod* aArg1 = NULL, dsql_nod* 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;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual bool setParameterType(DsqlCompilerScratch* dsqlScratch,
|
2010-10-09 03:57:37 +02:00
|
|
|
dsql_nod* node, bool forceVarChar);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const;
|
2010-09-20 18:07:50 +02:00
|
|
|
virtual bool expressionEqual(thread_db* tdbb, CompilerScratch* csb, /*const*/ ExprNode* other,
|
|
|
|
USHORT stream) /*const*/;
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
// add and add2 are used in somewhat obscure way in aggregation.
|
2010-11-14 23:31:42 +01:00
|
|
|
static dsc* add(const dsc* desc, impure_value* value, const ValueExprNode* node, UCHAR blrOp);
|
|
|
|
static dsc* add2(const dsc* desc, impure_value* value, const ValueExprNode* node, UCHAR blrOp);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
|
|
|
|
private:
|
|
|
|
dsc* multiply(const dsc* desc, impure_value* value) const;
|
|
|
|
dsc* multiply2(const dsc* desc, impure_value* value) const;
|
|
|
|
dsc* divide2(const dsc* desc, impure_value* value) const;
|
|
|
|
dsc* addDateTime(const dsc* desc, impure_value* value) const;
|
|
|
|
dsc* addSqlDate(const dsc* desc, impure_value* value) const;
|
|
|
|
dsc* addSqlTime(const dsc* desc, impure_value* value) const;
|
|
|
|
dsc* addTimeStamp(const dsc* desc, impure_value* value) const;
|
|
|
|
|
|
|
|
private:
|
|
|
|
void makeDialect1(dsc* desc, dsc& desc1, dsc& desc2);
|
|
|
|
void makeDialect3(dsc* desc, dsc& desc1, dsc& desc2);
|
|
|
|
|
|
|
|
void getDescDialect1(thread_db* tdbb, dsc* desc, dsc& desc1, dsc& desc2);
|
|
|
|
void getDescDialect3(thread_db* tdbb, dsc* desc, dsc& desc1, dsc& desc2);
|
|
|
|
|
|
|
|
public:
|
|
|
|
UCHAR blrOp;
|
|
|
|
bool dialect1;
|
|
|
|
Firebird::string label;
|
|
|
|
dsql_nod* dsqlArg1;
|
|
|
|
dsql_nod* dsqlArg2;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> arg1;
|
|
|
|
NestConst<ValueExprNode> arg2;
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-11-02 00:57:31 +01:00
|
|
|
class CastNode : public TypedNode<ValueExprNode, ExprNode::TYPE_CAST>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
CastNode(MemoryPool& pool, dsql_nod* aDsqlSource = NULL, dsql_fld* aDsqlField = 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 ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual bool setParameterType(DsqlCompilerScratch* dsqlScratch,
|
2010-11-02 00:57:31 +01:00
|
|
|
dsql_nod* node, bool forceVarChar);
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-11-02 00:57:31 +01:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
|
|
|
virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const;
|
|
|
|
virtual bool expressionEqual(thread_db* tdbb, CompilerScratch* csb, /*const*/ ExprNode* other,
|
|
|
|
USHORT stream) /*const*/;
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass1(thread_db* tdbb, CompilerScratch* csb);
|
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-11-02 00:57:31 +01:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
dsql_nod* dsqlSource;
|
|
|
|
dsql_fld* dsqlField;
|
|
|
|
dsc castDesc;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> source;
|
2010-11-02 00:57:31 +01:00
|
|
|
NestConst<Format> format;
|
|
|
|
NestConst<ItemInfo> itemInfo;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-09-17 05:15:32 +02:00
|
|
|
class ConcatenateNode : public TypedNode<ValueExprNode, ExprNode::TYPE_CONCATENATE>
|
2010-02-13 21:29:29 +01:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit ConcatenateNode(MemoryPool& pool, dsql_nod* aArg1 = NULL, dsql_nod* 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;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
2010-02-13 21:29:29 +01:00
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual bool setParameterType(DsqlCompilerScratch* dsqlScratch,
|
2010-10-09 03:57:37 +02:00
|
|
|
dsql_nod* node, bool forceVarChar);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-02-13 21:29:29 +01:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-02-13 21:29:29 +01:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
dsql_nod* dsqlArg1;
|
|
|
|
dsql_nod* dsqlArg2;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> arg1;
|
|
|
|
NestConst<ValueExprNode> arg2;
|
2010-02-13 21:29:29 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-09-17 05:15:32 +02:00
|
|
|
class CurrentDateNode : public TypedNode<ValueExprNode, ExprNode::TYPE_CURRENT_DATE>
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
{
|
|
|
|
public:
|
2010-09-23 11:48:42 +02:00
|
|
|
explicit CurrentDateNode(MemoryPool& pool)
|
2010-09-17 05:15:32 +02:00
|
|
|
: TypedNode<ValueExprNode, ExprNode::TYPE_CURRENT_DATE>(pool)
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
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 setParameterName(dsql_par* parameter) const;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-09-17 05:15:32 +02:00
|
|
|
class CurrentTimeNode : public TypedNode<ValueExprNode, ExprNode::TYPE_CURRENT_TIME>
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
CurrentTimeNode(MemoryPool& pool, unsigned aPrecision)
|
2010-09-17 05:15:32 +02:00
|
|
|
: TypedNode<ValueExprNode, ExprNode::TYPE_CURRENT_TIME>(pool),
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
precision(aPrecision)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
|
|
|
|
|
|
|
|
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
unsigned precision;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-09-17 05:15:32 +02:00
|
|
|
class CurrentTimeStampNode : public TypedNode<ValueExprNode, ExprNode::TYPE_CURRENT_TIMESTAMP>
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
CurrentTimeStampNode(MemoryPool& pool, unsigned aPrecision)
|
2010-09-17 05:15:32 +02:00
|
|
|
: TypedNode<ValueExprNode, ExprNode::TYPE_CURRENT_TIMESTAMP>(pool),
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
precision(aPrecision)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
|
|
|
|
|
|
|
|
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
unsigned precision;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-09-17 05:15:32 +02:00
|
|
|
class CurrentRoleNode : public TypedNode<ValueExprNode, ExprNode::TYPE_CURRENT_ROLE>
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
{
|
|
|
|
public:
|
2010-09-23 11:48:42 +02:00
|
|
|
explicit CurrentRoleNode(MemoryPool& pool)
|
2010-09-17 05:15:32 +02:00
|
|
|
: TypedNode<ValueExprNode, ExprNode::TYPE_CURRENT_ROLE>(pool)
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
|
|
|
|
|
|
|
|
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-09-17 05:15:32 +02:00
|
|
|
class CurrentUserNode : public TypedNode<ValueExprNode, ExprNode::TYPE_CURRENT_USER>
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
{
|
|
|
|
public:
|
2010-09-23 11:48:42 +02:00
|
|
|
explicit CurrentUserNode(MemoryPool& pool)
|
2010-09-17 05:15:32 +02:00
|
|
|
: TypedNode<ValueExprNode, ExprNode::TYPE_CURRENT_USER>(pool)
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
|
|
|
|
|
|
|
|
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-10-09 03:57:37 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-10-09 03:57:37 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-11-07 23:12:14 +01:00
|
|
|
class DerivedExprNode : public TypedNode<ValueExprNode, ExprNode::TYPE_DERIVED_EXPR>
|
|
|
|
{
|
|
|
|
public:
|
2010-11-09 00:17:01 +01:00
|
|
|
DerivedExprNode(MemoryPool& pool)
|
|
|
|
: TypedNode<ValueExprNode, ExprNode::TYPE_DERIVED_EXPR>(pool),
|
|
|
|
arg(NULL),
|
|
|
|
streamList(pool)
|
|
|
|
{
|
|
|
|
addChildNode(arg);
|
|
|
|
}
|
2010-11-07 23:12:14 +01:00
|
|
|
|
|
|
|
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
|
|
|
|
|
|
|
|
// This is a non-DSQL node.
|
|
|
|
|
|
|
|
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch)
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc)
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual bool computable(CompilerScratch* csb, SSHORT stream, bool idxUse,
|
2010-11-21 04:47:29 +01:00
|
|
|
bool allowOnlyCurrentStream, ValueExprNode* value);
|
2010-11-07 23:12:14 +01:00
|
|
|
|
|
|
|
virtual void findDependentFromStreams(const OptimizerRetrieval* optRet,
|
|
|
|
SortedStreamList* streamList);
|
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass1(thread_db* tdbb, CompilerScratch* csb);
|
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-11-07 23:12:14 +01:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> arg;
|
2010-11-07 23:12:14 +01:00
|
|
|
Firebird::Array<USHORT> streamList;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-11-07 21:26:11 +01:00
|
|
|
class DomainValidationNode : public TypedNode<ValueExprNode, ExprNode::TYPE_DOMAIN_VALIDATION>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit DomainValidationNode(MemoryPool& pool)
|
|
|
|
: TypedNode<ValueExprNode, ExprNode::TYPE_DOMAIN_VALIDATION>(pool)
|
|
|
|
{
|
|
|
|
domDesc.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
// This is a non-DSQL node.
|
|
|
|
|
|
|
|
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch)
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc)
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-11-07 21:26:11 +01:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
dsc domDesc;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-10-16 20:53:25 +02:00
|
|
|
class ExtractNode : public TypedNode<ValueExprNode, ExprNode::TYPE_EXTRACT>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
ExtractNode(MemoryPool& pool, UCHAR aBlrSubOp, dsql_nod* 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 ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual bool setParameterType(DsqlCompilerScratch* dsqlScratch,
|
2010-10-16 20:53:25 +02:00
|
|
|
dsql_nod* node, bool forceVarChar);
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-10-16 20:53:25 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
|
|
|
virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const;
|
|
|
|
virtual bool expressionEqual(thread_db* tdbb, CompilerScratch* csb, /*const*/ ExprNode* other,
|
|
|
|
USHORT stream) /*const*/;
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-10-16 20:53:25 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
UCHAR blrSubOp;
|
|
|
|
dsql_nod* dsqlArg;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> arg;
|
2010-10-16 20:53:25 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-11-14 18:25:48 +01:00
|
|
|
class FieldNode : public TypedNode<ValueExprNode, ExprNode::TYPE_FIELD>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit FieldNode(MemoryPool& pool);
|
|
|
|
|
|
|
|
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 ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
|
|
|
virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const;
|
|
|
|
virtual bool expressionEqual(thread_db* tdbb, CompilerScratch* csb, /*const*/ ExprNode* other,
|
|
|
|
USHORT stream) /*const*/;
|
|
|
|
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual bool jrdPossibleUnknownFinder()
|
2010-11-14 18:25:48 +01:00
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual bool jrdStreamFinder(CompilerScratch* /*csb*/, UCHAR findStream)
|
2010-11-14 18:25:48 +01:00
|
|
|
{
|
2010-11-21 04:47:29 +01:00
|
|
|
return fieldStream == findStream;
|
2010-11-14 18:25:48 +01:00
|
|
|
}
|
|
|
|
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual void jrdStreamsCollector(Firebird::SortedArray<int>& streamList)
|
2010-11-14 18:25:48 +01:00
|
|
|
{
|
2010-11-21 04:47:29 +01:00
|
|
|
if (!streamList.exist(fieldStream))
|
|
|
|
streamList.add(fieldStream);
|
2010-11-14 18:25:48 +01:00
|
|
|
}
|
|
|
|
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual bool jrdUnmappableNode(const MapNode* mapNode, UCHAR shellStream)
|
2010-11-14 18:25:48 +01:00
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual bool computable(CompilerScratch* csb, SSHORT stream, bool idxUse,
|
2010-11-21 04:47:29 +01:00
|
|
|
bool allowOnlyCurrentStream, ValueExprNode* value);
|
2010-11-14 18:25:48 +01:00
|
|
|
|
|
|
|
virtual void findDependentFromStreams(const OptimizerRetrieval* optRet,
|
|
|
|
SortedStreamList* streamList);
|
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass1(thread_db* tdbb, CompilerScratch* csb);
|
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-11-14 18:25:48 +01:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
bool byId;
|
|
|
|
USHORT fieldStream;
|
|
|
|
USHORT fieldId;
|
|
|
|
const Format* format;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> defaultValue;
|
2010-11-14 18:25:48 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-10-09 03:57:37 +02:00
|
|
|
class GenIdNode : public TypedNode<ValueExprNode, ExprNode::TYPE_GEN_ID>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
GenIdNode(MemoryPool& pool, bool aDialect1, const Firebird::MetaName& aName,
|
|
|
|
dsql_nod* 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 ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
|
|
|
virtual bool setParameterType(DsqlCompilerScratch* dsqlScratch,
|
|
|
|
dsql_nod* node, bool forceVarChar) const;
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-10-09 03:57:37 +02:00
|
|
|
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual bool jrdUnmappableNode(const MapNode* mapNode, UCHAR shellStream)
|
2010-10-09 03:57:37 +02:00
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-10-09 03:57:37 +02:00
|
|
|
virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const;
|
|
|
|
virtual bool expressionEqual(thread_db* tdbb, CompilerScratch* csb, /*const*/ ExprNode* other,
|
|
|
|
USHORT stream) /*const*/;
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
2010-10-09 03:57:37 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
bool dialect1;
|
|
|
|
Firebird::MetaName name;
|
|
|
|
dsql_nod* dsqlArg;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> arg;
|
2010-10-09 03:57:37 +02:00
|
|
|
SLONG id;
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-09-17 05:15:32 +02:00
|
|
|
class InternalInfoNode : public TypedNode<ValueExprNode, ExprNode::TYPE_INTERNAL_INFO>
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
// Constants stored in BLR.
|
|
|
|
enum InfoType
|
|
|
|
{
|
|
|
|
INFO_TYPE_UNKNOWN = 0,
|
|
|
|
INFO_TYPE_CONNECTION_ID = 1,
|
|
|
|
INFO_TYPE_TRANSACTION_ID = 2,
|
|
|
|
INFO_TYPE_GDSCODE = 3,
|
|
|
|
INFO_TYPE_SQLCODE = 4,
|
|
|
|
INFO_TYPE_ROWS_AFFECTED = 5,
|
|
|
|
INFO_TYPE_TRIGGER_ACTION = 6,
|
|
|
|
INFO_TYPE_SQLSTATE = 7,
|
|
|
|
MAX_INFO_TYPE
|
|
|
|
};
|
|
|
|
|
|
|
|
struct InfoAttr
|
|
|
|
{
|
|
|
|
const char* alias;
|
|
|
|
unsigned mask;
|
|
|
|
};
|
|
|
|
|
|
|
|
static const InfoAttr INFO_TYPE_ATTRIBUTES[MAX_INFO_TYPE];
|
|
|
|
|
2010-09-23 11:48:42 +02:00
|
|
|
explicit InternalInfoNode(MemoryPool& pool, dsql_nod* aArg = NULL);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
|
|
|
|
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
|
|
|
|
|
|
|
|
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
dsql_nod* dsqlArg;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> arg;
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-10-24 02:26:00 +02:00
|
|
|
class LiteralNode : public TypedNode<ValueExprNode, ExprNode::TYPE_LITERAL>
|
|
|
|
{
|
|
|
|
public:
|
2010-11-14 18:25:48 +01:00
|
|
|
explicit LiteralNode(MemoryPool& pool);
|
2010-10-24 02:26:00 +02:00
|
|
|
|
|
|
|
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
|
|
|
|
static void genConstant(DsqlCompilerScratch* dsqlScratch, const dsc* desc, bool negateValue);
|
|
|
|
|
|
|
|
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
|
|
|
virtual ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual bool setParameterType(DsqlCompilerScratch* dsqlScratch,
|
2010-10-24 02:26:00 +02:00
|
|
|
dsql_nod* node, bool forceVarChar);
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-10-24 02:26:00 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
|
|
|
virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const;
|
|
|
|
virtual bool expressionEqual(thread_db* tdbb, CompilerScratch* csb, /*const*/ ExprNode* other,
|
|
|
|
USHORT stream) /*const*/;
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-10-24 02:26:00 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
SLONG getSlong() const
|
|
|
|
{
|
|
|
|
fb_assert(litDesc.dsc_dtype == dtype_long);
|
|
|
|
return *reinterpret_cast<SLONG*>(litDesc.dsc_address);
|
|
|
|
}
|
|
|
|
|
|
|
|
public:
|
|
|
|
dsql_str* dsqlStr;
|
|
|
|
dsc litDesc;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-11-14 18:25:48 +01:00
|
|
|
class DsqlMapNode : public TypedNode<ValueExprNode, ExprNode::TYPE_MAP>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
DsqlMapNode(MemoryPool& pool, dsql_ctx* aContext, dsql_map* aMap);
|
|
|
|
|
|
|
|
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
|
|
|
virtual ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
|
|
|
|
virtual bool dsqlAggregateFinder(AggregateFinder& visitor);
|
|
|
|
virtual bool dsqlAggregate2Finder(Aggregate2Finder& visitor);
|
|
|
|
virtual bool dsqlInvalidReferenceFinder(InvalidReferenceFinder& visitor);
|
|
|
|
virtual bool dsqlSubSelectFinder(SubSelectFinder& visitor);
|
|
|
|
virtual bool dsqlFieldFinder(FieldFinder& visitor);
|
|
|
|
virtual bool dsqlFieldRemapper(FieldRemapper& visitor);
|
|
|
|
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
|
|
|
virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const;
|
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc)
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier)
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
public:
|
|
|
|
dsql_ctx* context;
|
|
|
|
dsql_map* map;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class DerivedFieldNode : public TypedNode<ValueExprNode, ExprNode::TYPE_DERIVED_FIELD>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
DerivedFieldNode(MemoryPool& pool, const Firebird::MetaName& aName, USHORT aScope,
|
|
|
|
dsql_nod* aDsqlValue);
|
|
|
|
|
|
|
|
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
|
|
|
virtual ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
|
|
|
|
virtual bool dsqlAggregateFinder(AggregateFinder& visitor);
|
|
|
|
virtual bool dsqlAggregate2Finder(Aggregate2Finder& visitor);
|
|
|
|
virtual bool dsqlInvalidReferenceFinder(InvalidReferenceFinder& visitor);
|
|
|
|
virtual bool dsqlSubSelectFinder(SubSelectFinder& visitor);
|
|
|
|
virtual bool dsqlFieldFinder(FieldFinder& visitor);
|
|
|
|
virtual bool dsqlFieldRemapper(FieldRemapper& visitor);
|
|
|
|
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc)
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier)
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
public:
|
|
|
|
Firebird::MetaName name;
|
|
|
|
USHORT scope;
|
|
|
|
dsql_nod* dsqlValue;
|
|
|
|
dsql_ctx* context;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-09-17 05:15:32 +02:00
|
|
|
class NegateNode : public TypedNode<ValueExprNode, ExprNode::TYPE_NEGATE>
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
{
|
|
|
|
public:
|
2010-09-23 11:48:42 +02:00
|
|
|
explicit NegateNode(MemoryPool& pool, dsql_nod* aArg = NULL);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
|
|
|
|
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
|
|
|
|
|
|
|
|
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual bool setParameterType(DsqlCompilerScratch* dsqlScratch,
|
2010-10-09 03:57:37 +02:00
|
|
|
dsql_nod* node, bool forceVarChar);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
dsql_nod* dsqlArg;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> arg;
|
Refactor a number of expression nodes: nod_add, nod_divide, nod_multiply, nod_negate, nod_user_name, nod_subtract, nod_current_date, nod_current_time, nod_current_timestamp, nod_add2, nod_subtract2, nod_multiply2, nod_divide2, nod_current_role, nod_internal_info
2010-09-04 23:36:41 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-10-22 17:00:22 +02:00
|
|
|
class NullNode : public TypedNode<ValueExprNode, ExprNode::TYPE_NULL>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit NullNode(MemoryPool& pool)
|
|
|
|
: TypedNode<ValueExprNode, ExprNode::TYPE_NULL>(pool)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
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 setParameterName(dsql_par* parameter) const;
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-10-22 17:00:22 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-10-22 17:00:22 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-02-13 21:29:29 +01:00
|
|
|
// OVER is used only in DSQL. In the engine, normal aggregate functions are used in partitioned
|
|
|
|
// maps.
|
2010-09-17 05:15:32 +02:00
|
|
|
class OverNode : public TypedNode<ValueExprNode, ExprNode::TYPE_OVER>
|
2010-02-13 21:29:29 +01:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit OverNode(MemoryPool& pool, dsql_nod* aAggExpr = NULL, dsql_nod* aPartition = NULL,
|
|
|
|
dsql_nod* aOrder = NULL);
|
|
|
|
|
|
|
|
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
2010-02-13 21:29:29 +01:00
|
|
|
|
|
|
|
virtual bool dsqlAggregateFinder(AggregateFinder& visitor);
|
|
|
|
virtual bool dsqlAggregate2Finder(Aggregate2Finder& visitor);
|
|
|
|
virtual bool dsqlInvalidReferenceFinder(InvalidReferenceFinder& visitor);
|
|
|
|
virtual bool dsqlSubSelectFinder(SubSelectFinder& visitor);
|
|
|
|
virtual bool dsqlFieldRemapper(FieldRemapper& visitor);
|
|
|
|
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-02-13 21:29:29 +01:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-02-13 21:29:29 +01:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
dsql_nod* dsqlAggExpr;
|
|
|
|
dsql_nod* dsqlPartition;
|
|
|
|
dsql_nod* dsqlOrder;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-10-09 03:57:37 +02:00
|
|
|
class ParameterNode : public TypedNode<ValueExprNode, ExprNode::TYPE_PARAMETER>
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
// CVC: This is a guess for the length of the parameter for LIKE and others, when the
|
|
|
|
// original dtype isn't string and force_varchar is true.
|
|
|
|
static const int LIKE_PARAM_LEN = 30;
|
|
|
|
|
|
|
|
public:
|
2010-11-14 18:25:48 +01:00
|
|
|
explicit ParameterNode(MemoryPool& pool);
|
2010-10-09 03:57:37 +02:00
|
|
|
|
|
|
|
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 ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual bool setParameterType(DsqlCompilerScratch* dsqlScratch,
|
2010-10-09 03:57:37 +02:00
|
|
|
dsql_nod* node, bool forceVarChar);
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-10-09 03:57:37 +02:00
|
|
|
virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const;
|
|
|
|
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual bool jrdUnmappableNode(const MapNode* mapNode, UCHAR shellStream)
|
2010-10-09 03:57:37 +02:00
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-10-09 03:57:37 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
USHORT dsqlParameterIndex;
|
|
|
|
dsql_par* dsqlParameter;
|
|
|
|
NestConst<jrd_nod> message;
|
|
|
|
USHORT argNumber;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> argFlag;
|
|
|
|
NestConst<ValueExprNode> argIndicator;
|
2010-10-09 03:57:37 +02:00
|
|
|
NestConst<ItemInfo> argInfo;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-11-14 18:25:48 +01:00
|
|
|
class RecordKeyNode : public TypedNode<ValueExprNode, ExprNode::TYPE_RECORD_KEY>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
RecordKeyNode(MemoryPool& pool, UCHAR aBlrOp, const Firebird::MetaName& aDsqlQualifier = 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 ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
|
|
|
|
virtual bool dsqlAggregate2Finder(Aggregate2Finder& visitor);
|
|
|
|
virtual bool dsqlInvalidReferenceFinder(InvalidReferenceFinder& visitor);
|
|
|
|
virtual bool dsqlSubSelectFinder(SubSelectFinder& visitor);
|
|
|
|
virtual bool dsqlFieldFinder(FieldFinder& visitor);
|
|
|
|
virtual bool dsqlFieldRemapper(FieldRemapper& visitor);
|
|
|
|
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
|
|
|
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual bool jrdPossibleUnknownFinder()
|
2010-11-14 18:25:48 +01:00
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual bool jrdStreamFinder(CompilerScratch* csb, UCHAR findStream);
|
|
|
|
virtual void jrdStreamsCollector(Firebird::SortedArray<int>& streamList);
|
2010-11-14 18:25:48 +01:00
|
|
|
|
|
|
|
virtual bool computable(CompilerScratch* csb, SSHORT stream, bool idxUse,
|
2010-11-21 04:47:29 +01:00
|
|
|
bool allowOnlyCurrentStream, ValueExprNode* value);
|
2010-11-14 18:25:48 +01:00
|
|
|
|
|
|
|
virtual void findDependentFromStreams(const OptimizerRetrieval* optRet,
|
|
|
|
SortedStreamList* streamList);
|
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
|
|
|
virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const;
|
|
|
|
virtual bool expressionEqual(thread_db* tdbb, CompilerScratch* csb, /*const*/ ExprNode* other,
|
|
|
|
USHORT stream) /*const*/;
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass1(thread_db* tdbb, CompilerScratch* csb);
|
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-11-14 18:25:48 +01:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
private:
|
2010-11-21 04:47:29 +01:00
|
|
|
static ValueExprNode* catenateNodes(thread_db* tdbb, ValueExprNodeStack& stack);
|
2010-11-14 18:25:48 +01:00
|
|
|
|
|
|
|
public:
|
|
|
|
UCHAR blrOp;
|
|
|
|
Firebird::MetaName dsqlQualifier;
|
|
|
|
dsql_nod* dsqlRelation;
|
|
|
|
USHORT recStream;
|
|
|
|
bool aggregate;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-11-09 00:17:01 +01:00
|
|
|
class ScalarNode : public TypedNode<ValueExprNode, ExprNode::TYPE_SCALAR>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit ScalarNode(MemoryPool& pool)
|
|
|
|
: TypedNode<ValueExprNode, ExprNode::TYPE_SCALAR>(pool),
|
|
|
|
field(NULL),
|
|
|
|
subscripts(NULL)
|
|
|
|
{
|
|
|
|
addChildNode(field);
|
|
|
|
addChildNode(subscripts);
|
|
|
|
}
|
|
|
|
|
|
|
|
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
|
|
|
|
|
|
|
|
// This is a non-DSQL node.
|
|
|
|
|
|
|
|
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch)
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc)
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-11-09 00:17:01 +01:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> field;
|
|
|
|
NestConst<ValueListNode> subscripts;
|
2010-11-09 00:17:01 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-11-14 18:25:48 +01:00
|
|
|
class StmtExprNode : public TypedNode<ValueExprNode, ExprNode::TYPE_STMT_EXPR>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit StmtExprNode(MemoryPool& pool)
|
|
|
|
: TypedNode<ValueExprNode, ExprNode::TYPE_STMT_EXPR>(pool),
|
|
|
|
stmt(NULL),
|
|
|
|
expr(NULL)
|
|
|
|
{
|
|
|
|
// Do not add the statement. We'll manually handle it in pass1 and pass2.
|
|
|
|
addChildNode(expr);
|
|
|
|
}
|
|
|
|
|
|
|
|
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, UCHAR blrOp);
|
|
|
|
|
|
|
|
// This is a non-DSQL node.
|
|
|
|
|
|
|
|
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch)
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc)
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass1(thread_db* tdbb, CompilerScratch* csb);
|
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-11-14 18:25:48 +01:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
NestConst<jrd_nod> stmt;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> expr;
|
2010-11-14 18:25:48 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-10-09 20:39:45 +02:00
|
|
|
class StrCaseNode : public TypedNode<ValueExprNode, ExprNode::TYPE_STR_CASE>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
StrCaseNode(MemoryPool& pool, UCHAR aBlrOp, dsql_nod* 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 ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual bool setParameterType(DsqlCompilerScratch* dsqlScratch,
|
2010-10-09 20:39:45 +02:00
|
|
|
dsql_nod* node, bool forceVarChar);
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-10-09 20:39:45 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
|
|
|
virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const;
|
|
|
|
virtual bool expressionEqual(thread_db* tdbb, CompilerScratch* csb, /*const*/ ExprNode* other,
|
|
|
|
USHORT stream) /*const*/;
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-10-09 20:39:45 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
UCHAR blrOp;
|
|
|
|
dsql_nod* dsqlArg;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> arg;
|
2010-10-09 20:39:45 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-10-16 20:17:00 +02:00
|
|
|
class StrLenNode : public TypedNode<ValueExprNode, ExprNode::TYPE_STR_LEN>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
StrLenNode(MemoryPool& pool, UCHAR aBlrSubOp, dsql_nod* 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 ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual bool setParameterType(DsqlCompilerScratch* dsqlScratch,
|
2010-10-16 20:17:00 +02:00
|
|
|
dsql_nod* node, bool forceVarChar);
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-10-16 20:17:00 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
|
|
|
virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const;
|
|
|
|
virtual bool expressionEqual(thread_db* tdbb, CompilerScratch* csb, /*const*/ ExprNode* other,
|
|
|
|
USHORT stream) /*const*/;
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-10-16 20:17:00 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
UCHAR blrSubOp;
|
|
|
|
dsql_nod* dsqlArg;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> arg;
|
2010-10-16 20:17:00 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-11-07 03:18:58 +01:00
|
|
|
// This node is used for DSQL subqueries and for legacy (BLR-only) functionality.
|
|
|
|
class SubQueryNode : public TypedNode<ValueExprNode, ExprNode::TYPE_SUBQUERY>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit SubQueryNode(MemoryPool& pool, UCHAR aBlrOp, dsql_nod* aDsqlRse = NULL,
|
|
|
|
dsql_nod* aValue1 = NULL, dsql_nod* aValue2 = 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 ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-11-07 03:18:58 +01:00
|
|
|
|
|
|
|
virtual bool dsqlAggregateFinder(AggregateFinder& visitor);
|
|
|
|
virtual bool dsqlAggregate2Finder(Aggregate2Finder& visitor);
|
|
|
|
virtual bool dsqlSubSelectFinder(SubSelectFinder& visitor);
|
|
|
|
virtual bool dsqlFieldFinder(FieldFinder& visitor);
|
|
|
|
virtual bool dsqlFieldRemapper(FieldRemapper& visitor);
|
|
|
|
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual bool jrdUnmappableNode(const MapNode* mapNode, UCHAR shellStream)
|
2010-11-07 03:18:58 +01:00
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual bool jrdPossibleUnknownFinder()
|
2010-11-07 03:18:58 +01:00
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual bool jrdStreamFinder(CompilerScratch* csb, UCHAR findStream);
|
|
|
|
virtual void jrdStreamsCollector(Firebird::SortedArray<int>& streamList);
|
2010-11-07 03:18:58 +01:00
|
|
|
|
|
|
|
virtual bool computable(CompilerScratch* csb, SSHORT stream, bool idxUse,
|
2010-11-21 04:47:29 +01:00
|
|
|
bool allowOnlyCurrentStream, ValueExprNode* value);
|
2010-11-07 03:18:58 +01:00
|
|
|
|
|
|
|
virtual void findDependentFromStreams(const OptimizerRetrieval* optRet,
|
|
|
|
SortedStreamList* streamList);
|
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
|
|
|
virtual bool expressionEqual(thread_db* tdbb, CompilerScratch* csb, /*const*/ ExprNode* other,
|
|
|
|
USHORT stream) /*const*/;
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass1(thread_db* tdbb, CompilerScratch* csb);
|
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-11-07 03:18:58 +01:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
UCHAR blrOp;
|
|
|
|
dsql_nod* dsqlRse;
|
|
|
|
dsql_nod* dsqlValue1;
|
|
|
|
dsql_nod* dsqlValue2;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<RseNode> rse;
|
|
|
|
NestConst<ValueExprNode> value1;
|
|
|
|
NestConst<ValueExprNode> value2;
|
2010-11-07 03:18:58 +01:00
|
|
|
NestConst<RecordSource> rsb;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-10-16 19:42:04 +02:00
|
|
|
class SubstringNode : public TypedNode<ValueExprNode, ExprNode::TYPE_SUBSTRING>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit SubstringNode(MemoryPool& pool, dsql_nod* aExpr = NULL,
|
|
|
|
dsql_nod* aStart = NULL, dsql_nod* aLength = 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 ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual bool setParameterType(DsqlCompilerScratch* dsqlScratch,
|
2010-10-16 19:42:04 +02:00
|
|
|
dsql_nod* node, bool forceVarChar);
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-10-16 19:42:04 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-10-16 19:42:04 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
static dsc* perform(thread_db* tdbb, impure_value* impure, const dsc* valueDsc,
|
|
|
|
const dsc* startDsc, const dsc* lengthDsc);
|
|
|
|
|
|
|
|
public:
|
|
|
|
dsql_nod* dsqlExpr;
|
|
|
|
dsql_nod* dsqlStart;
|
|
|
|
dsql_nod* dsqlLength;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> expr;
|
|
|
|
NestConst<ValueExprNode> start;
|
|
|
|
NestConst<ValueExprNode> length;
|
2010-10-16 19:42:04 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-09-17 05:15:32 +02:00
|
|
|
class SubstringSimilarNode : public TypedNode<ValueExprNode, ExprNode::TYPE_SUBSTRING_SIMILAR>
|
2010-02-21 02:47:54 +01:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit SubstringSimilarNode(MemoryPool& pool, dsql_nod* aExpr = NULL,
|
|
|
|
dsql_nod* aPattern = NULL, dsql_nod* aEscape = 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;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
2010-02-21 02:47:54 +01:00
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual bool setParameterType(DsqlCompilerScratch* dsqlScratch,
|
2010-10-09 03:57:37 +02:00
|
|
|
dsql_nod* node, bool forceVarChar);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-02-21 02:47:54 +01:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass1(thread_db* tdbb, CompilerScratch* csb);
|
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-02-21 02:47:54 +01:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
dsql_nod* dsqlExpr;
|
|
|
|
dsql_nod* dsqlPattern;
|
|
|
|
dsql_nod* dsqlEscape;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> expr;
|
|
|
|
NestConst<ValueExprNode> pattern;
|
|
|
|
NestConst<ValueExprNode> escape;
|
2010-02-21 02:47:54 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-09-17 05:15:32 +02:00
|
|
|
class SysFuncCallNode : public TypedNode<ValueExprNode, ExprNode::TYPE_SYSFUNC_CALL>
|
2010-04-05 20:43:11 +02:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit SysFuncCallNode(MemoryPool& pool, const Firebird::MetaName& aName,
|
|
|
|
dsql_nod* aArgs = 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;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
2010-04-05 20:43:11 +02:00
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-04-05 20:43:11 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-04-05 20:43:11 +02:00
|
|
|
virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const;
|
2010-09-20 18:07:50 +02:00
|
|
|
virtual bool expressionEqual(thread_db* tdbb, CompilerScratch* csb, /*const*/ ExprNode* other,
|
|
|
|
USHORT stream) /*const*/;
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-04-05 20:43:11 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
Firebird::MetaName name;
|
|
|
|
dsql_nod* dsqlArgs;
|
|
|
|
bool dsqlSpecialSyntax;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueListNode> args;
|
2010-04-05 20:43:11 +02:00
|
|
|
const SysFunction* function;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-10-09 20:39:45 +02:00
|
|
|
class TrimNode : public TypedNode<ValueExprNode, ExprNode::TYPE_TRIM>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit TrimNode(MemoryPool& pool, UCHAR aWhere,
|
|
|
|
dsql_nod* aValue = NULL, dsql_nod* aTrimChars = 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 ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual bool setParameterType(DsqlCompilerScratch* dsqlScratch,
|
2010-10-09 20:39:45 +02:00
|
|
|
dsql_nod* node, bool forceVarChar);
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-10-09 20:39:45 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
|
|
|
virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const;
|
|
|
|
virtual bool expressionEqual(thread_db* tdbb, CompilerScratch* csb, /*const*/ ExprNode* other,
|
|
|
|
USHORT stream) /*const*/;
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-10-09 20:39:45 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
UCHAR where;
|
|
|
|
dsql_nod* dsqlValue;
|
|
|
|
dsql_nod* dsqlTrimChars; // may be NULL
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> value;
|
|
|
|
NestConst<ValueExprNode> trimChars; // may be NULL
|
2010-10-09 20:39:45 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-09-17 05:15:32 +02:00
|
|
|
class UdfCallNode : public TypedNode<ValueExprNode, ExprNode::TYPE_UDF_CALL>
|
2010-04-05 20:43:11 +02:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit UdfCallNode(MemoryPool& pool, const Firebird::QualifiedName& aName,
|
|
|
|
dsql_nod* aArgs = 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;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
2010-04-05 20:43:11 +02:00
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-04-05 20:43:11 +02:00
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
2010-09-17 05:15:32 +02:00
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-04-05 20:43:11 +02:00
|
|
|
virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const;
|
2010-09-20 18:07:50 +02:00
|
|
|
virtual bool expressionEqual(thread_db* tdbb, CompilerScratch* csb, /*const*/ ExprNode* other,
|
|
|
|
USHORT stream) /*const*/;
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass1(thread_db* tdbb, CompilerScratch* csb);
|
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-04-05 20:43:11 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
Firebird::QualifiedName name;
|
|
|
|
dsql_nod* dsqlArgs;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueListNode> args;
|
2010-08-11 04:59:33 +02:00
|
|
|
NestConst<Function> function;
|
2010-04-05 20:43:11 +02:00
|
|
|
|
|
|
|
private:
|
|
|
|
dsql_udf* dsqlFunction;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-09-20 18:07:50 +02:00
|
|
|
class ValueIfNode : public TypedNode<ValueExprNode, ExprNode::TYPE_VALUE_IF>
|
|
|
|
{
|
|
|
|
public:
|
2010-09-23 11:48:42 +02:00
|
|
|
explicit ValueIfNode(MemoryPool& pool, dsql_nod* aCondition = NULL, dsql_nod* aTrueValue = NULL,
|
2010-09-20 18:07:50 +02:00
|
|
|
dsql_nod* aFalseValue = 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 ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual bool setParameterType(DsqlCompilerScratch* dsqlScratch,
|
2010-10-09 03:57:37 +02:00
|
|
|
dsql_nod* node, bool forceVarChar);
|
2010-09-20 18:07:50 +02:00
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-09-20 18:07:50 +02:00
|
|
|
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual bool jrdPossibleUnknownFinder()
|
2010-09-20 18:07:50 +02:00
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-09-20 18:07:50 +02:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
dsql_nod* dsqlCondition;
|
|
|
|
dsql_nod* dsqlTrueValue;
|
|
|
|
dsql_nod* dsqlFalseValue;
|
|
|
|
NestConst<BoolExprNode> condition;
|
2010-11-21 04:47:29 +01:00
|
|
|
NestConst<ValueExprNode> trueValue;
|
|
|
|
NestConst<ValueExprNode> falseValue;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Container for a list of value expressions.
|
|
|
|
class ValueListNode : public TypedNode<ValueExprNode, ExprNode::TYPE_VALUE_LIST>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
ValueListNode(MemoryPool& pool, unsigned count);
|
|
|
|
|
|
|
|
// This is a non-DSQL node.
|
|
|
|
|
|
|
|
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch)
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc)
|
|
|
|
{
|
|
|
|
fb_assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual ValueListNode* copy(thread_db* tdbb, NodeCopier& copier);
|
|
|
|
|
|
|
|
virtual ValueListNode* pass1(thread_db* tdbb, CompilerScratch* csb)
|
|
|
|
{
|
|
|
|
ValueExprNode::pass1(tdbb, csb);
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual ValueListNode* pass2(thread_db* tdbb, CompilerScratch* csb)
|
|
|
|
{
|
|
|
|
ValueExprNode::pass2(tdbb, csb);
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc)
|
|
|
|
{
|
|
|
|
fb_assert(false); // Invalid operation.
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const
|
|
|
|
{
|
|
|
|
fb_assert(false); // Invalid operation.
|
|
|
|
}
|
|
|
|
|
|
|
|
public:
|
|
|
|
NestValueArray args;
|
2010-09-20 18:07:50 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-11-02 18:05:01 +01:00
|
|
|
class VariableNode : public TypedNode<ValueExprNode, ExprNode::TYPE_VARIABLE>
|
|
|
|
{
|
|
|
|
public:
|
2010-11-14 18:25:48 +01:00
|
|
|
explicit VariableNode(MemoryPool& pool);
|
2010-11-02 18:05:01 +01:00
|
|
|
|
|
|
|
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 ValueExprNode* dsqlPass(DsqlCompilerScratch* dsqlScratch);
|
|
|
|
virtual void setParameterName(dsql_par* parameter) const;
|
|
|
|
virtual void genBlr(DsqlCompilerScratch* dsqlScratch);
|
2010-11-07 04:03:41 +01:00
|
|
|
virtual void make(DsqlCompilerScratch* dsqlScratch, dsc* desc);
|
2010-11-02 18:05:01 +01:00
|
|
|
virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const;
|
|
|
|
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual bool jrdUnmappableNode(const MapNode* mapNode, UCHAR shellStream)
|
2010-11-02 18:05:01 +01:00
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc);
|
|
|
|
virtual ValueExprNode* copy(thread_db* tdbb, NodeCopier& copier);
|
2010-11-21 04:47:29 +01:00
|
|
|
virtual ValueExprNode* pass1(thread_db* tdbb, CompilerScratch* csb);
|
|
|
|
virtual ValueExprNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
2010-11-02 18:05:01 +01:00
|
|
|
virtual dsc* execute(thread_db* tdbb, jrd_req* request) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
dsql_var* dsqlVar;
|
|
|
|
dsc varDesc;
|
|
|
|
USHORT varId;
|
|
|
|
NestConst<jrd_nod> varDecl;
|
|
|
|
NestConst<ItemInfo> varInfo;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-02-13 21:29:29 +01:00
|
|
|
} // namespace
|
|
|
|
|
|
|
|
#endif // DSQL_EXPR_NODES_H
|