Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
3f84c37d
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1187
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
3f84c37d
编写于
10月 23, 2021
作者:
H
Haojun Liao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[td-10564] Add more implementation of parser.
上级
24090f01
变更
19
展开全部
隐藏空白更改
内联
并排
Showing
19 changed file
with
1884 addition
and
763 deletion
+1884
-763
include/libs/function/function.h
include/libs/function/function.h
+35
-0
include/libs/planner/planner.h
include/libs/planner/planner.h
+12
-12
include/util/tdef.h
include/util/tdef.h
+6
-5
source/libs/catalog/src/catalog.c
source/libs/catalog/src/catalog.c
+4
-0
source/libs/function/inc/texpr.h
source/libs/function/inc/texpr.h
+1
-29
source/libs/function/src/texpr.c
source/libs/function/src/texpr.c
+52
-54
source/libs/function/src/tfunction.c
source/libs/function/src/tfunction.c
+8
-0
source/libs/parser/inc/astGenerator.h
source/libs/parser/inc/astGenerator.h
+1
-1
source/libs/parser/inc/parserInt.h
source/libs/parser/inc/parserInt.h
+10
-15
source/libs/parser/inc/parserUtil.h
source/libs/parser/inc/parserUtil.h
+13
-1
source/libs/parser/inc/queryInfoUtil.h
source/libs/parser/inc/queryInfoUtil.h
+4
-3
source/libs/parser/src/astValidate.c
source/libs/parser/src/astValidate.c
+1577
-525
source/libs/parser/src/parser.c
source/libs/parser/src/parser.c
+11
-10
source/libs/parser/src/parserUtil.c
source/libs/parser/src/parserUtil.c
+75
-33
source/libs/parser/src/queryInfoUtil.c
source/libs/parser/src/queryInfoUtil.c
+44
-53
source/libs/parser/test/tokenizerTest.cpp
source/libs/parser/test/tokenizerTest.cpp
+12
-3
source/libs/planner/inc/plannerInt.h
source/libs/planner/inc/plannerInt.h
+2
-2
source/libs/planner/src/planner.c
source/libs/planner/src/planner.c
+4
-4
src/query/tests/astTest.cpp
src/query/tests/astTest.cpp
+13
-13
未找到文件。
include/libs/function/function.h
浏览文件 @
3f84c37d
...
...
@@ -22,10 +22,12 @@ extern "C" {
#include "common.h"
#include "tvariant.h"
#include "tbuffer.h"
#define FUNCTION_SCALAR 1
#define FUNCTION_AGG 2
#define TOP_BOTTOM_QUERY_LIMIT 100
#define FUNCTIONS_NAME_MAX_LENGTH 16
#define FUNCTION_INVALID_ID -1
...
...
@@ -121,6 +123,35 @@ typedef struct SQLFunctionCtx {
SPoint1
end
;
}
SQLFunctionCtx
;
enum
{
TEXPR_NODE_DUMMY
=
0x0
,
TEXPR_BINARYEXPR_NODE
=
0x1
,
TEXPR_UNARYEXPR_NODE
=
0x2
,
TEXPR_COL_NODE
=
0x4
,
TEXPR_VALUE_NODE
=
0x8
,
};
typedef
struct
tExprNode
{
uint8_t
nodeType
;
union
{
struct
{
union
{
int32_t
optr
;
// binary operator
int32_t
functionId
;
// unary operator
};
void
*
info
;
// support filter operation on this expression only available for leaf node
struct
tExprNode
*
pLeft
;
// left child pointer
struct
tExprNode
*
pRight
;
// right child pointer
}
_node
;
SSchema
*
pSchema
;
// column node
struct
SVariant
*
pVal
;
// value node
};
}
tExprNode
;
void
exprTreeToBinary
(
SBufferWriter
*
bw
,
tExprNode
*
pExprTree
);
void
tExprTreeDestroy
(
tExprNode
*
pNode
,
void
(
*
fp
)(
void
*
));
typedef
struct
SAggFunctionInfo
{
char
name
[
FUNCTIONS_NAME_MAX_LENGTH
];
int8_t
type
;
// Scalar function or aggregation function
...
...
@@ -158,6 +189,10 @@ int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionI
*/
int32_t
qIsBuiltinFunction
(
const
char
*
name
,
int32_t
len
);
bool
qIsValidUdf
(
SArray
*
pUdfInfo
,
const
char
*
name
,
int32_t
len
,
int32_t
*
functionId
);
const
char
*
qGetFunctionName
(
int32_t
functionId
);
#ifdef __cplusplus
}
#endif
...
...
include/libs/planner/planner.h
浏览文件 @
3f84c37d
...
...
@@ -24,8 +24,8 @@ extern "C" {
#define QUERY_TYPE_PARTIAL 2
struct
SEpSet
;
struct
SQueryNode
;
struct
SQuery
Phy
Node
;
struct
SQuery
Plan
Node
;
struct
SQuery
DistPlan
Node
;
struct
SQueryStmtInfo
;
typedef
struct
SSubquery
{
...
...
@@ -33,7 +33,7 @@ typedef struct SSubquery {
int32_t
type
;
// QUERY_TYPE_MERGE|QUERY_TYPE_PARTIAL
int32_t
level
;
// the execution level of current subquery, starting from 0.
SArray
*
pUpstream
;
// the upstream,from which to fetch the result
struct
SQuery
Phy
Node
*
pNode
;
// physical plan of current subquery
struct
SQuery
DistPlan
Node
*
pNode
;
// physical plan of current subquery
}
SSubquery
;
typedef
struct
SQueryJob
{
...
...
@@ -48,7 +48,7 @@ typedef struct SQueryJob {
* @param pQueryNode
* @return
*/
int32_t
qOptimizeQueryPlan
(
struct
SQueryNode
*
pQueryNode
);
int32_t
qOptimizeQueryPlan
(
struct
SQuery
Plan
Node
*
pQueryNode
);
/**
* Create the query plan according to the bound AST, which is in the form of pQueryInfo
...
...
@@ -56,14 +56,14 @@ int32_t qOptimizeQueryPlan(struct SQueryNode* pQueryNode);
* @param pQueryNode
* @return
*/
int32_t
qCreateQueryPlan
(
const
struct
SQueryStmtInfo
*
pQueryInfo
,
struct
SQueryNode
*
pQueryNode
);
int32_t
qCreateQueryPlan
(
const
struct
SQueryStmtInfo
*
pQueryInfo
,
struct
SQuery
Plan
Node
*
pQueryNode
);
/**
* Convert the query plan to string, in order to display it in the shell.
* @param pQueryNode
* @return
*/
int32_t
qQueryPlanToString
(
struct
SQueryNode
*
pQueryNode
,
char
**
str
);
int32_t
qQueryPlanToString
(
struct
SQuery
Plan
Node
*
pQueryNode
,
char
**
str
);
/**
* Restore the SQL statement according to the logic query plan.
...
...
@@ -71,7 +71,7 @@ int32_t qQueryPlanToString(struct SQueryNode* pQueryNode, char** str);
* @param sql
* @return
*/
int32_t
qQueryPlanToSql
(
struct
SQueryNode
*
pQueryNode
,
char
**
sql
);
int32_t
qQueryPlanToSql
(
struct
SQuery
Plan
Node
*
pQueryNode
,
char
**
sql
);
/**
* Create the physical plan for the query, according to the logic plan.
...
...
@@ -79,7 +79,7 @@ int32_t qQueryPlanToSql(struct SQueryNode* pQueryNode, char** sql);
* @param pPhyNode
* @return
*/
int32_t
qCreatePhysicalPlan
(
struct
SQuery
Node
*
pQueryNode
,
struct
SEpSet
*
pQnode
,
struct
SQueryPhy
Node
*
pPhyNode
);
int32_t
qCreatePhysicalPlan
(
struct
SQuery
PlanNode
*
pQueryNode
,
struct
SEpSet
*
pQnode
,
struct
SQueryDistPlan
Node
*
pPhyNode
);
/**
* Convert to physical plan to string to enable to print it out in the shell.
...
...
@@ -87,20 +87,20 @@ int32_t qCreatePhysicalPlan(struct SQueryNode* pQueryNode, struct SEpSet* pQnode
* @param str
* @return
*/
int32_t
qPhyPlanToString
(
struct
SQuery
Phy
Node
*
pPhyNode
,
char
**
str
);
int32_t
qPhyPlanToString
(
struct
SQuery
DistPlan
Node
*
pPhyNode
,
char
**
str
);
/**
* Destroy the query plan object.
* @return
*/
void
*
qDestroyQueryPlan
(
struct
SQueryNode
*
pQueryNode
);
void
*
qDestroyQueryPlan
(
struct
SQuery
Plan
Node
*
pQueryNode
);
/**
* Destroy the physical plan.
* @param pQueryPhyNode
* @return
*/
void
*
qDestroyQueryPhyPlan
(
struct
SQuery
Phy
Node
*
pQueryPhyNode
);
void
*
qDestroyQueryPhyPlan
(
struct
SQuery
DistPlan
Node
*
pQueryPhyNode
);
/**
* Create the query job from the physical execution plan
...
...
@@ -108,7 +108,7 @@ void* qDestroyQueryPhyPlan(struct SQueryPhyNode* pQueryPhyNode);
* @param pJob
* @return
*/
int32_t
qCreateQueryJob
(
const
struct
SQuery
Phy
Node
*
pPhyNode
,
struct
SQueryJob
**
pJob
);
int32_t
qCreateQueryJob
(
const
struct
SQuery
DistPlan
Node
*
pPhyNode
,
struct
SQueryJob
**
pJob
);
#ifdef __cplusplus
}
...
...
include/util/tdef.h
浏览文件 @
3f84c37d
...
...
@@ -125,11 +125,12 @@ do { \
#define TSDB_RELATION_MATCH 14
#define TSDB_RELATION_NMATCH 15
#define TSDB_BINARY_OP_ADD 30
#define TSDB_BINARY_OP_SUBTRACT 31
#define TSDB_BINARY_OP_MULTIPLY 32
#define TSDB_BINARY_OP_DIVIDE 33
#define TSDB_BINARY_OP_REMAINDER 34
#define TSDB_BINARY_OP_ADD 4000
#define TSDB_BINARY_OP_SUBTRACT 4001
#define TSDB_BINARY_OP_MULTIPLY 4002
#define TSDB_BINARY_OP_DIVIDE 4003
#define TSDB_BINARY_OP_REMAINDER 4004
#define TSDB_BINARY_OP_CONCAT 4005
#define IS_RELATION_OPTR(op) (((op) >= TSDB_RELATION_LESS) && ((op) < TSDB_RELATION_IN))
...
...
source/libs/catalog/src/catalog.c
浏览文件 @
3f84c37d
...
...
@@ -18,3 +18,7 @@
struct
SCatalog
*
getCatalogHandle
(
const
SEpSet
*
pMgmtEps
)
{
return
NULL
;
}
int32_t
catalogGetMetaData
(
struct
SCatalog
*
pCatalog
,
const
SMetaReq
*
pMetaReq
,
SMetaData
*
pMetaData
)
{
return
0
;
}
source/libs/
executor
/inc/texpr.h
→
source/libs/
function
/inc/texpr.h
浏览文件 @
3f84c37d
...
...
@@ -25,7 +25,7 @@ extern "C" {
#include "taosmsg.h"
#include "taosdef.h"
#include "tskiplist.h"
#include "
tbuffer
.h"
#include "
function
.h"
struct
tExprNode
;
struct
SSchema
;
...
...
@@ -43,13 +43,6 @@ struct SSchema;
typedef
bool
(
*
__result_filter_fn_t
)(
const
void
*
,
void
*
);
typedef
void
(
*
__do_filter_suppl_fn_t
)(
void
*
,
void
*
);
enum
{
TSQL_NODE_DUMMY
=
0x0
,
TSQL_NODE_EXPR
=
0x1
,
TSQL_NODE_COL
=
0x2
,
TSQL_NODE_VALUE
=
0x4
,
};
/**
* this structure is used to filter data in tags, so the offset of filtered tag column in tagdata string is required
*/
...
...
@@ -61,37 +54,16 @@ typedef struct tQueryInfo {
bool
indexed
;
// indexed columns
}
tQueryInfo
;
typedef
struct
tExprNode
{
uint8_t
nodeType
;
union
{
struct
{
uint8_t
optr
;
// filter operator
uint8_t
hasPK
;
// 0: do not contain primary filter, 1: contain
void
*
info
;
// support filter operation on this expression only available for leaf node
struct
tExprNode
*
pLeft
;
// left child pointer
struct
tExprNode
*
pRight
;
// right child pointer
}
_node
;
SSchema
*
pSchema
;
struct
SVariant
*
pVal
;
};
}
tExprNode
;
typedef
struct
SExprTraverseSupp
{
__result_filter_fn_t
nodeFilterFn
;
__do_filter_suppl_fn_t
setupInfoFn
;
void
*
pExtInfo
;
}
SExprTraverseSupp
;
void
tExprTreeDestroy
(
tExprNode
*
pNode
,
void
(
*
fp
)(
void
*
));
void
exprTreeToBinary
(
SBufferWriter
*
bw
,
tExprNode
*
pExprTree
);
tExprNode
*
exprTreeFromBinary
(
const
void
*
data
,
size_t
size
);
tExprNode
*
exprTreeFromTableName
(
const
char
*
tbnameCond
);
tExprNode
*
exprdup
(
tExprNode
*
pTree
);
void
exprTreeToBinary
(
SBufferWriter
*
bw
,
tExprNode
*
pExprTree
);
bool
exprTreeApplyFilter
(
tExprNode
*
pExpr
,
const
void
*
pItem
,
SExprTraverseSupp
*
param
);
void
arithmeticTreeTraverse
(
tExprNode
*
pExprs
,
int32_t
numOfRows
,
char
*
pOutput
,
void
*
param
,
int32_t
order
,
...
...
source/libs/
executor
/src/texpr.c
→
source/libs/
function
/src/texpr.c
浏览文件 @
3f84c37d
...
...
@@ -15,7 +15,6 @@
#include "os.h"
#include "texpr.h"
#include "exception.h"
#include "taosdef.h"
#include "taosmsg.h"
...
...
@@ -26,21 +25,21 @@
#include "thash.h"
#include "tskiplist.h"
#include "texpr.h"
#include "tarithoperator.h"
//
#include "tarithoperator.h"
#include "tvariant.h"
static
uint8_t
UNUSED_FUNC
isQueryOnPrimaryKey
(
const
char
*
primaryColumnName
,
const
tExprNode
*
pLeft
,
const
tExprNode
*
pRight
)
{
if
(
pLeft
->
nodeType
==
TSQL_NODE_COL
)
{
// if left node is the primary column,return true
return
(
strcmp
(
primaryColumnName
,
pLeft
->
pSchema
->
name
)
==
0
)
?
1
:
0
;
}
else
{
// if any children have query on primary key, their parents are also keep this value
return
((
pLeft
->
nodeType
==
TSQL_NODE_EXPR
&&
pLeft
->
_node
.
hasPK
==
1
)
||
(
pRight
->
nodeType
==
TSQL_NODE_EXPR
&&
pRight
->
_node
.
hasPK
==
1
))
==
true
?
1
:
0
;
}
}
//
static uint8_t UNUSED_FUNC isQueryOnPrimaryKey(const char *primaryColumnName, const tExprNode *pLeft, const tExprNode *pRight) {
// if (pLeft->nodeType == TEXPR_COL_NODE
) {
//
// if left node is the primary column,return true
//
return (strcmp(primaryColumnName, pLeft->pSchema->name) == 0) ? 1 : 0;
//
} else {
//
// if any children have query on primary key, their parents are also keep this value
// return ((pLeft->nodeType == TEXPR_BINARYEXPR_NODE
&& pLeft->_node.hasPK == 1) ||
// (pRight->nodeType == TEXPR_BINARYEXPR_NODE
&& pRight->_node.hasPK == 1)) == true
//
? 1
//
: 0;
//
}
//
}
static
void
reverseCopy
(
char
*
dest
,
const
char
*
src
,
int16_t
type
,
int32_t
numOfRows
)
{
switch
(
type
)
{
...
...
@@ -114,11 +113,11 @@ void tExprTreeDestroy(tExprNode *pNode, void (*fp)(void *)) {
return
;
}
if
(
pNode
->
nodeType
==
T
SQL_NODE_EXPR
)
{
if
(
pNode
->
nodeType
==
T
EXPR_BINARYEXPR_NODE
||
pNode
->
nodeType
==
TEXPR_UNARYEXPR_NODE
)
{
doExprTreeDestroy
(
&
pNode
,
fp
);
}
else
if
(
pNode
->
nodeType
==
T
SQL_NODE_VALU
E
)
{
}
else
if
(
pNode
->
nodeType
==
T
EXPR_VALUE_NOD
E
)
{
taosVariantDestroy
(
pNode
->
pVal
);
}
else
if
(
pNode
->
nodeType
==
T
SQL_NODE_COL
)
{
}
else
if
(
pNode
->
nodeType
==
T
EXPR_COL_NODE
)
{
tfree
(
pNode
->
pSchema
);
}
...
...
@@ -130,17 +129,17 @@ static void doExprTreeDestroy(tExprNode **pExpr, void (*fp)(void *)) {
return
;
}
if
((
*
pExpr
)
->
nodeType
==
T
SQL_NODE_EXPR
)
{
if
((
*
pExpr
)
->
nodeType
==
T
EXPR_BINARYEXPR_NODE
)
{
doExprTreeDestroy
(
&
(
*
pExpr
)
->
_node
.
pLeft
,
fp
);
doExprTreeDestroy
(
&
(
*
pExpr
)
->
_node
.
pRight
,
fp
);
if
(
fp
!=
NULL
)
{
fp
((
*
pExpr
)
->
_node
.
info
);
}
}
else
if
((
*
pExpr
)
->
nodeType
==
T
SQL_NODE_VALU
E
)
{
}
else
if
((
*
pExpr
)
->
nodeType
==
T
EXPR_VALUE_NOD
E
)
{
taosVariantDestroy
((
*
pExpr
)
->
pVal
);
free
((
*
pExpr
)
->
pVal
);
}
else
if
((
*
pExpr
)
->
nodeType
==
T
SQL_NODE_COL
)
{
}
else
if
((
*
pExpr
)
->
nodeType
==
T
EXPR_COL_NODE
)
{
free
((
*
pExpr
)
->
pSchema
);
}
...
...
@@ -153,7 +152,7 @@ bool exprTreeApplyFilter(tExprNode *pExpr, const void *pItem, SExprTraverseSupp
tExprNode
*
pRight
=
pExpr
->
_node
.
pRight
;
//non-leaf nodes, recursively traverse the expression tree in the post-root order
if
(
pLeft
->
nodeType
==
T
SQL_NODE_EXPR
&&
pRight
->
nodeType
==
TSQL_NODE_EXPR
)
{
if
(
pLeft
->
nodeType
==
T
EXPR_BINARYEXPR_NODE
&&
pRight
->
nodeType
==
TEXPR_BINARYEXPR_NODE
)
{
if
(
pExpr
->
_node
.
optr
==
TSDB_RELATION_OR
)
{
// or
if
(
exprTreeApplyFilter
(
pLeft
,
pItem
,
param
))
{
return
true
;
...
...
@@ -180,26 +179,26 @@ void arithmeticTreeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pOutput,
if
(
pExprs
==
NULL
)
{
return
;
}
#if 0
tExprNode *pLeft = pExprs->_node.pLeft;
tExprNode *pRight = pExprs->_node.pRight;
/* the left output has result from the left child syntax tree */
char *pLeftOutput = (char*)malloc(sizeof(int64_t) * numOfRows);
if
(
pLeft
->
nodeType
==
T
SQL_NODE_EXPR
)
{
if (pLeft->nodeType == T
EXPR_BINARYEXPR_NODE
) {
arithmeticTreeTraverse(pLeft, numOfRows, pLeftOutput, param, order, getSourceDataBlock);
}
/
* the right output has result from the right child syntax tree */
/
/ the right output has result from the right child syntax tree
char *pRightOutput = malloc(sizeof(int64_t) * numOfRows);
char *pdata = malloc(sizeof(int64_t) * numOfRows);
if
(
pRight
->
nodeType
==
T
SQL_NODE_EXPR
)
{
if (pRight->nodeType == T
EXPR_BINARYEXPR_NODE
) {
arithmeticTreeTraverse(pRight, numOfRows, pRightOutput, param, order, getSourceDataBlock);
}
if
(
pLeft
->
nodeType
==
T
SQL_NODE_EXPR
)
{
if
(
pRight
->
nodeType
==
T
SQL_NODE_EXPR
)
{
if (pLeft->nodeType == T
EXPR_BINARYEXPR_NODE
) {
if (pRight->nodeType == T
EXPR_BINARYEXPR_NODE
) {
/*
* exprLeft + exprRight
* the type of returned value of one expression is always double float precious
...
...
@@ -207,7 +206,7 @@ void arithmeticTreeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pOutput,
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
OperatorFn(pLeftOutput, numOfRows, TSDB_DATA_TYPE_DOUBLE, pRightOutput, numOfRows, TSDB_DATA_TYPE_DOUBLE, pOutput, TSDB_ORDER_ASC);
}
else
if
(
pRight
->
nodeType
==
T
SQL_NODE_COL
)
{
// exprLeft + columnRight
} else if (pRight->nodeType == T
EXPR_COL_NODE
) { // exprLeft + columnRight
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
// set input buffer
...
...
@@ -219,14 +218,14 @@ void arithmeticTreeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pOutput,
OperatorFn(pLeftOutput, numOfRows, TSDB_DATA_TYPE_DOUBLE, pInputData, numOfRows, pRight->pSchema->type, pOutput, TSDB_ORDER_ASC);
}
}
else
if
(
pRight
->
nodeType
==
T
SQL_NODE_VALU
E
)
{
// exprLeft + 12
} else if (pRight->nodeType == T
EXPR_VALUE_NOD
E) { // exprLeft + 12
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
OperatorFn(pLeftOutput, numOfRows, TSDB_DATA_TYPE_DOUBLE, &pRight->pVal->i64, 1, pRight->pVal->nType, pOutput, TSDB_ORDER_ASC);
}
}
else
if
(
pLeft
->
nodeType
==
T
SQL_NODE_COL
)
{
} else if (pLeft->nodeType == T
EXPR_COL_NODE
) {
// column data specified on left-hand-side
char *pLeftInputData = getSourceDataBlock(param, pLeft->pSchema->name, pLeft->pSchema->colId);
if
(
pRight
->
nodeType
==
T
SQL_NODE_EXPR
)
{
// columnLeft + expr2
if (pRight->nodeType == T
EXPR_BINARYEXPR_NODE
) { // columnLeft + expr2
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
if (order == TSDB_ORDER_DESC) {
...
...
@@ -236,14 +235,14 @@ void arithmeticTreeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pOutput,
OperatorFn(pLeftInputData, numOfRows, pLeft->pSchema->type, pRightOutput, numOfRows, TSDB_DATA_TYPE_DOUBLE, pOutput, TSDB_ORDER_ASC);
}
}
else
if
(
pRight
->
nodeType
==
T
SQL_NODE_COL
)
{
// columnLeft + columnRight
} else if (pRight->nodeType == T
EXPR_COL_NODE
) { // columnLeft + columnRight
// column data specified on right-hand-side
char *pRightInputData = getSourceDataBlock(param, pRight->pSchema->name, pRight->pSchema->colId);
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
// both columns are descending order, do not reverse the source data
OperatorFn(pLeftInputData, numOfRows, pLeft->pSchema->type, pRightInputData, numOfRows, pRight->pSchema->type, pOutput, order);
}
else
if
(
pRight
->
nodeType
==
T
SQL_NODE_VALU
E
)
{
// columnLeft + 12
} else if (pRight->nodeType == T
EXPR_VALUE_NOD
E) { // columnLeft + 12
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
if (order == TSDB_ORDER_DESC) {
...
...
@@ -255,11 +254,11 @@ void arithmeticTreeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pOutput,
}
} else {
// column data specified on left-hand-side
if
(
pRight
->
nodeType
==
T
SQL_NODE_EXPR
)
{
// 12 + expr2
if (pRight->nodeType == T
EXPR_BINARYEXPR_NODE
) { // 12 + expr2
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
OperatorFn(&pLeft->pVal->i64, 1, pLeft->pVal->nType, pRightOutput, numOfRows, TSDB_DATA_TYPE_DOUBLE, pOutput, TSDB_ORDER_ASC);
}
else
if
(
pRight
->
nodeType
==
T
SQL_NODE_COL
)
{
// 12 + columnRight
} else if (pRight->nodeType == T
EXPR_COL_NODE
) { // 12 + columnRight
// column data specified on right-hand-side
char *pRightInputData = getSourceDataBlock(param, pRight->pSchema->name, pRight->pSchema->colId);
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
...
...
@@ -271,7 +270,7 @@ void arithmeticTreeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pOutput,
OperatorFn(&pLeft->pVal->i64, 1, pLeft->pVal->nType, pRightInputData, numOfRows, pRight->pSchema->type, pOutput, TSDB_ORDER_ASC);
}
}
else
if
(
pRight
->
nodeType
==
T
SQL_NODE_VALU
E
)
{
// 12 + 12
} else if (pRight->nodeType == T
EXPR_VALUE_NOD
E) { // 12 + 12
_arithmetic_operator_fn_t OperatorFn = getArithmeticOperatorFn(pExprs->_node.optr);
OperatorFn(&pLeft->pVal->i64, 1, pLeft->pVal->nType, &pRight->pVal->i64, 1, pRight->pVal->nType, pOutput, TSDB_ORDER_ASC);
}
...
...
@@ -280,12 +279,14 @@ void arithmeticTreeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pOutput,
tfree(pdata);
tfree(pLeftOutput);
tfree(pRightOutput);
#endif
}
static
void
exprTreeToBinaryImpl
(
SBufferWriter
*
bw
,
tExprNode
*
expr
)
{
tbufWriteUint8
(
bw
,
expr
->
nodeType
);
if
(
expr
->
nodeType
==
T
SQL_NODE_VALU
E
)
{
if
(
expr
->
nodeType
==
T
EXPR_VALUE_NOD
E
)
{
SVariant
*
pVal
=
expr
->
pVal
;
tbufWriteUint32
(
bw
,
pVal
->
nType
);
...
...
@@ -296,16 +297,15 @@ static void exprTreeToBinaryImpl(SBufferWriter* bw, tExprNode* expr) {
tbufWriteInt64
(
bw
,
pVal
->
i64
);
}
}
else
if
(
expr
->
nodeType
==
T
SQL_NODE_COL
)
{
}
else
if
(
expr
->
nodeType
==
T
EXPR_COL_NODE
)
{
SSchema
*
pSchema
=
expr
->
pSchema
;
tbufWriteInt16
(
bw
,
pSchema
->
colId
);
tbufWriteInt16
(
bw
,
pSchema
->
bytes
);
tbufWriteUint8
(
bw
,
pSchema
->
type
);
tbufWriteString
(
bw
,
pSchema
->
name
);
}
else
if
(
expr
->
nodeType
==
T
SQL_NODE_EXPR
)
{
}
else
if
(
expr
->
nodeType
==
T
EXPR_BINARYEXPR_NODE
)
{
tbufWriteUint8
(
bw
,
expr
->
_node
.
optr
);
tbufWriteUint8
(
bw
,
expr
->
_node
.
hasPK
);
exprTreeToBinaryImpl
(
bw
,
expr
->
_node
.
pLeft
);
exprTreeToBinaryImpl
(
bw
,
expr
->
_node
.
pRight
);
}
...
...
@@ -353,7 +353,7 @@ static tExprNode* exprTreeFromBinaryImpl(SBufferReader* br) {
CLEANUP_PUSH_VOID_PTR_PTR
(
true
,
tExprTreeDestroy
,
pExpr
,
NULL
);
pExpr
->
nodeType
=
tbufReadUint8
(
br
);
if
(
pExpr
->
nodeType
==
T
SQL_NODE_VALU
E
)
{
if
(
pExpr
->
nodeType
==
T
EXPR_VALUE_NOD
E
)
{
SVariant
*
pVal
=
exception_calloc
(
1
,
sizeof
(
SVariant
));
pExpr
->
pVal
=
pVal
;
...
...
@@ -366,7 +366,7 @@ static tExprNode* exprTreeFromBinaryImpl(SBufferReader* br) {
pVal
->
i64
=
tbufReadInt64
(
br
);
}
}
else
if
(
pExpr
->
nodeType
==
T
SQL_NODE_COL
)
{
}
else
if
(
pExpr
->
nodeType
==
T
EXPR_COL_NODE
)
{
SSchema
*
pSchema
=
exception_calloc
(
1
,
sizeof
(
SSchema
));
pExpr
->
pSchema
=
pSchema
;
...
...
@@ -375,9 +375,8 @@ static tExprNode* exprTreeFromBinaryImpl(SBufferReader* br) {
pSchema
->
type
=
tbufReadUint8
(
br
);
tbufReadToString
(
br
,
pSchema
->
name
,
TSDB_COL_NAME_LEN
);
}
else
if
(
pExpr
->
nodeType
==
T
SQL_NODE_EXPR
)
{
}
else
if
(
pExpr
->
nodeType
==
T
EXPR_BINARYEXPR_NODE
)
{
pExpr
->
_node
.
optr
=
tbufReadUint8
(
br
);
pExpr
->
_node
.
hasPK
=
tbufReadUint8
(
br
);
pExpr
->
_node
.
pLeft
=
exprTreeFromBinaryImpl
(
br
);
pExpr
->
_node
.
pRight
=
exprTreeFromBinaryImpl
(
br
);
assert
(
pExpr
->
_node
.
pLeft
!=
NULL
&&
pExpr
->
_node
.
pRight
!=
NULL
);
...
...
@@ -406,12 +405,12 @@ tExprNode* exprTreeFromTableName(const char* tbnameCond) {
tExprNode
*
expr
=
exception_calloc
(
1
,
sizeof
(
tExprNode
));
CLEANUP_PUSH_VOID_PTR_PTR
(
true
,
tExprTreeDestroy
,
expr
,
NULL
);
expr
->
nodeType
=
T
SQL_NODE_EXPR
;
expr
->
nodeType
=
T
EXPR_BINARYEXPR_NODE
;
tExprNode
*
left
=
exception_calloc
(
1
,
sizeof
(
tExprNode
));
expr
->
_node
.
pLeft
=
left
;
left
->
nodeType
=
T
SQL_NODE_COL
;
left
->
nodeType
=
T
EXPR_COL_NODE
;
SSchema
*
pSchema
=
exception_calloc
(
1
,
sizeof
(
SSchema
));
left
->
pSchema
=
pSchema
;
...
...
@@ -421,7 +420,7 @@ tExprNode* exprTreeFromTableName(const char* tbnameCond) {
expr
->
_node
.
pRight
=
right
;
if
(
strncmp
(
tbnameCond
,
QUERY_COND_REL_PREFIX_LIKE
,
QUERY_COND_REL_PREFIX_LIKE_LEN
)
==
0
)
{
right
->
nodeType
=
T
SQL_NODE_VALU
E
;
right
->
nodeType
=
T
EXPR_VALUE_NOD
E
;
expr
->
_node
.
optr
=
TSDB_RELATION_LIKE
;
SVariant
*
pVal
=
exception_calloc
(
1
,
sizeof
(
SVariant
));
right
->
pVal
=
pVal
;
...
...
@@ -432,7 +431,7 @@ tExprNode* exprTreeFromTableName(const char* tbnameCond) {
pVal
->
nLen
=
(
int32_t
)
len
;
}
else
if
(
strncmp
(
tbnameCond
,
QUERY_COND_REL_PREFIX_MATCH
,
QUERY_COND_REL_PREFIX_MATCH_LEN
)
==
0
)
{
right
->
nodeType
=
T
SQL_NODE_VALU
E
;
right
->
nodeType
=
T
EXPR_VALUE_NOD
E
;
expr
->
_node
.
optr
=
TSDB_RELATION_MATCH
;
SVariant
*
pVal
=
exception_calloc
(
1
,
sizeof
(
SVariant
));
right
->
pVal
=
pVal
;
...
...
@@ -442,7 +441,7 @@ tExprNode* exprTreeFromTableName(const char* tbnameCond) {
pVal
->
nType
=
TSDB_DATA_TYPE_BINARY
;
pVal
->
nLen
=
(
int32_t
)
len
;
}
else
if
(
strncmp
(
tbnameCond
,
QUERY_COND_REL_PREFIX_NMATCH
,
QUERY_COND_REL_PREFIX_NMATCH_LEN
)
==
0
)
{
right
->
nodeType
=
T
SQL_NODE_VALU
E
;
right
->
nodeType
=
T
EXPR_VALUE_NOD
E
;
expr
->
_node
.
optr
=
TSDB_RELATION_NMATCH
;
SVariant
*
pVal
=
exception_calloc
(
1
,
sizeof
(
SVariant
));
right
->
pVal
=
pVal
;
...
...
@@ -452,7 +451,7 @@ tExprNode* exprTreeFromTableName(const char* tbnameCond) {
pVal
->
nType
=
TSDB_DATA_TYPE_BINARY
;
pVal
->
nLen
=
(
int32_t
)
len
;
}
else
if
(
strncmp
(
tbnameCond
,
QUERY_COND_REL_PREFIX_IN
,
QUERY_COND_REL_PREFIX_IN_LEN
)
==
0
)
{
right
->
nodeType
=
T
SQL_NODE_VALU
E
;
right
->
nodeType
=
T
EXPR_VALUE_NOD
E
;
expr
->
_node
.
optr
=
TSDB_RELATION_IN
;
SVariant
*
pVal
=
exception_calloc
(
1
,
sizeof
(
SVariant
));
right
->
pVal
=
pVal
;
...
...
@@ -706,18 +705,17 @@ tExprNode* exprdup(tExprNode* pNode) {
}
tExprNode
*
pCloned
=
calloc
(
1
,
sizeof
(
tExprNode
));
if
(
pNode
->
nodeType
==
T
SQL_NODE_EXPR
)
{
if
(
pNode
->
nodeType
==
T
EXPR_BINARYEXPR_NODE
)
{
tExprNode
*
pLeft
=
exprdup
(
pNode
->
_node
.
pLeft
);
tExprNode
*
pRight
=
exprdup
(
pNode
->
_node
.
pRight
);
pCloned
->
_node
.
pLeft
=
pLeft
;
pCloned
->
_node
.
pRight
=
pRight
;
pCloned
->
_node
.
optr
=
pNode
->
_node
.
optr
;
pCloned
->
_node
.
hasPK
=
pNode
->
_node
.
hasPK
;
}
else
if
(
pNode
->
nodeType
==
TSQL_NODE_VALUE
)
{
}
else
if
(
pNode
->
nodeType
==
TEXPR_VALUE_NODE
)
{
pCloned
->
pVal
=
calloc
(
1
,
sizeof
(
SVariant
));
taosVariantAssign
(
pCloned
->
pVal
,
pNode
->
pVal
);
}
else
if
(
pNode
->
nodeType
==
T
SQL_NODE_COL
)
{
}
else
if
(
pNode
->
nodeType
==
T
EXPR_COL_NODE
)
{
pCloned
->
pSchema
=
calloc
(
1
,
sizeof
(
SSchema
));
*
pCloned
->
pSchema
=
*
pNode
->
pSchema
;
}
...
...
source/libs/function/src/tfunction.c
浏览文件 @
3f84c37d
...
...
@@ -35,6 +35,14 @@ int32_t qIsBuiltinFunction(const char* name, int32_t len) {
}
}
bool
qIsValidUdf
(
SArray
*
pUdfInfo
,
const
char
*
name
,
int32_t
len
,
int32_t
*
functionId
)
{
return
true
;
}
const
char
*
qGetFunctionName
(
int32_t
functionId
)
{
}
bool
isTagsQuery
(
SArray
*
pFunctionIdList
)
{
int32_t
num
=
(
int32_t
)
taosArrayGetSize
(
pFunctionIdList
);
for
(
int32_t
i
=
0
;
i
<
num
;
++
i
)
{
...
...
source/libs/parser/inc/astGenerator.h
浏览文件 @
3f84c37d
...
...
@@ -233,7 +233,7 @@ typedef struct tSqlExpr {
// The complete string of the function(col, param), and the function name is kept in exprToken
struct
{
SToken
operand
;
struct
SArray
*
paramList
;
// function parameters list
struct
SArray
*
paramList
;
// function parameters list
}
Expr
;
SToken
columnName
;
// table column info
...
...
source/libs/parser/inc/parserInt.h
浏览文件 @
3f84c37d
...
...
@@ -29,6 +29,7 @@ struct SSqlNode;
typedef
struct
SColumnIndex
{
int16_t
tableIndex
;
int16_t
columnIndex
;
int16_t
type
;
// normal column/tag/ user input constant column
}
SColumnIndex
;
typedef
struct
SInsertStmtInfo
{
...
...
@@ -42,26 +43,15 @@ typedef struct SInsertStmtInfo {
// the structure for sql function in select clause
typedef
struct
SSqlExpr
{
char
aliasName
[
TSDB_COL_NAME_LEN
];
// as aliasName
char
token
[
TSDB_COL_NAME_LEN
];
// original token
SSchema
resSchema
;
SColIndex
colInfo
;
uint64_t
uid
;
// table uid, todo refactor use the pointer
int16_t
functionId
;
// function id in aAgg array
int16_t
resType
;
// return value type
int16_t
resBytes
;
// length of return value
int32_t
interBytes
;
// inter result buffer size
int16_t
colType
;
// table column type
int16_t
colBytes
;
// table column bytes
// int16_t colType; // table column type
// int16_t colBytes; // table column bytes
int16_t
numOfParams
;
// argument value of each function
SVariant
param
[
3
];
// parameters are not more than 3
int32_t
offset
;
// sub result column value of arithmetic expression.
int16_t
resColId
;
// result column id
SColumnFilterList
flist
;
}
SSqlExpr
;
typedef
struct
SExprInfo
{
...
...
@@ -81,6 +71,11 @@ typedef struct SInternalField {
SExprInfo
*
pExpr
;
}
SInternalField
;
typedef
struct
SMsgBuf
{
int32_t
len
;
char
*
buf
;
}
SMsgBuf
;
void
clearTableMetaInfo
(
STableMetaInfo
*
pTableMetaInfo
);
void
clearAllTableMetaInfo
(
SQueryStmtInfo
*
pQueryInfo
,
bool
removeMeta
,
uint64_t
id
);
...
...
@@ -104,7 +99,7 @@ int32_t qParserValidateSqlNode(struct SCatalog* pCatalog, SSqlInfo* pSqlInfo, SQ
* @param msgBufLen
* @return
*/
int32_t
evaluateSqlNode
(
SSqlNode
*
pNode
,
int32_t
tsPrecision
,
char
*
msg
,
int32_t
msgBufLen
);
int32_t
evaluateSqlNode
(
SSqlNode
*
pNode
,
int32_t
tsPrecision
,
SMsgBuf
*
pMsgBuf
);
/**
* Extract request meta info from the sql statement
...
...
source/libs/parser/inc/parserUtil.h
浏览文件 @
3f84c37d
...
...
@@ -22,6 +22,7 @@ extern "C" {
#include "os.h"
#include "ttoken.h"
#include "parserInt.h"
#define UTIL_TABLE_IS_SUPER_TABLE(metaInfo) \
(((metaInfo)->pTableMeta != NULL) && ((metaInfo)->pTableMeta->tableType == TSDB_SUPER_TABLE))
...
...
@@ -35,16 +36,27 @@ extern "C" {
#define UTIL_TABLE_IS_TMP_TABLE(metaInfo) \
(((metaInfo)->pTableMeta != NULL) && ((metaInfo)->pTableMeta->tableType == TSDB_TEMP_TABLE))
TAOS_FIELD
createField
(
const
SSchema
*
pSchema
);
void
setSchemaVal
(
SSchema
*
pSchema
,
uint8_t
type
,
int16_t
bytes
,
int16_t
colId
,
const
char
*
name
);
SInternalField
*
insertFieldInfo
(
SFieldInfo
*
pFieldInfo
,
int32_t
index
,
SSchema
*
field
);
int32_t
getNumOfFields
(
SFieldInfo
*
pFieldInfo
);
SInternalField
*
getInternalField
(
SFieldInfo
*
pFieldInfo
,
int32_t
index
);
int32_t
parserValidateIdToken
(
SToken
*
pToken
);
int32_t
buildInvalidOperationMsg
(
char
*
dst
,
int32_t
dstBufLen
,
const
char
*
msg
);
int32_t
buildInvalidOperationMsg
(
SMsgBuf
*
pMsgBuf
,
const
char
*
msg
);
int32_t
parserSetSyntaxErrMsg
(
char
*
dst
,
int32_t
dstBufLen
,
const
char
*
additionalInfo
,
const
char
*
sourceStr
);
int32_t
createProjectionExpr
(
SQueryStmtInfo
*
pQueryInfo
,
STableMetaInfo
*
pTableMetaInfo
,
SExprInfo
***
pExpr
,
int32_t
*
num
);
STableMetaInfo
*
addEmptyMetaInfo
(
SQueryStmtInfo
*
pQueryInfo
);
void
columnListCopy
(
SArray
*
dst
,
const
SArray
*
src
,
uint64_t
tableUid
);
void
columnListCopyAll
(
SArray
*
dst
,
const
SArray
*
src
);
void
columnListDestroy
(
SArray
*
pColumnList
);
SColumn
*
columnListInsert
(
SArray
*
pColumnList
,
int32_t
columnIndex
,
uint64_t
uid
,
SSchema
*
pSchema
);
SColumn
*
insertPrimaryTsColumn
(
SArray
*
pColumnList
,
uint64_t
tableUid
);
void
cleanupTagCond
(
STagCond
*
pTagCond
);
void
cleanupColumnCond
(
SArray
**
pCond
);
...
...
source/libs/parser/inc/queryInfoUtil.h
浏览文件 @
3f84c37d
...
...
@@ -13,7 +13,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TDENGINE_QUERYINFOUTIL_H
#define TDENGINE_QUERYINFOUTIL_H
...
...
@@ -31,8 +30,8 @@ SSchema *getTableTagSchema(const STableMeta* pTableMeta);
SSchema
*
getOneColumnSchema
(
const
STableMeta
*
pTableMeta
,
int32_t
colIndex
);
size_t
getNumOfExprs
(
SQueryStmtInfo
*
pQueryInfo
);
SExprInfo
*
createExprInfo
(
STableMetaInfo
*
pTableMetaInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
int16_t
size
,
int16_t
resColId
,
int16_t
interSize
,
int32_t
colTyp
e
);
SExprInfo
*
createExprInfo
(
STableMetaInfo
*
pTableMetaInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
SSchema
*
pResSchema
,
int16_t
interSiz
e
);
void
addExprInfo
(
SQueryStmtInfo
*
pQueryInfo
,
int32_t
index
,
SExprInfo
*
pExprInfo
);
void
updateExprInfo
(
SExprInfo
*
pExprInfo
,
int16_t
functionId
,
int32_t
colId
,
int16_t
srcColumnIndex
,
int16_t
resType
,
int16_t
resSize
);
void
assignExprInfo
(
SExprInfo
*
dst
,
const
SExprInfo
*
src
);
...
...
@@ -40,6 +39,8 @@ void assignExprInfo(SExprInfo* dst, const SExprInfo* src);
SExprInfo
*
getExprInfo
(
SQueryStmtInfo
*
pQueryInfo
,
int32_t
index
);
int32_t
copyAllExprInfo
(
SArray
*
dst
,
const
SArray
*
src
,
bool
deepcopy
);
void
addExprInfoParam
(
SSqlExpr
*
pExpr
,
char
*
argument
,
int32_t
type
,
int32_t
bytes
);
void
cleanupFieldInfo
(
SFieldInfo
*
pFieldInfo
);
STableComInfo
getTableInfo
(
const
STableMeta
*
pTableMeta
);
...
...
source/libs/parser/src/astValidate.c
浏览文件 @
3f84c37d
此差异已折叠。
点击以展开。
source/libs/parser/src/parser.c
浏览文件 @
3f84c37d
...
...
@@ -59,7 +59,7 @@ int32_t qParserConvertSql(const char* pStr, size_t length, char** pConvertSql) {
return
0
;
}
static
int32_t
getTableNameFromSqlNode
(
SSqlNode
*
pSqlNode
,
SArray
*
tableNameList
,
char
*
msg
,
int32_t
msgBufLen
);
static
int32_t
getTableNameFromSqlNode
(
SSqlNode
*
pSqlNode
,
SArray
*
tableNameList
,
SMsgBuf
*
pMsgBuf
);
static
int32_t
tnameComparFn
(
const
void
*
p1
,
const
void
*
p2
)
{
SName
*
pn1
=
(
SName
*
)
p1
;
...
...
@@ -83,7 +83,7 @@ static int32_t tnameComparFn(const void* p1, const void* p2) {
}
}
static
int32_t
getTableNameFromSubquery
(
SSqlNode
*
pSqlNode
,
SArray
*
tableNameList
,
char
*
msgBuf
,
int32_t
msgBufLen
)
{
static
int32_t
getTableNameFromSubquery
(
SSqlNode
*
pSqlNode
,
SArray
*
tableNameList
,
SMsgBuf
*
pMsgBuf
)
{
int32_t
numOfSub
=
(
int32_t
)
taosArrayGetSize
(
pSqlNode
->
from
->
list
);
for
(
int32_t
j
=
0
;
j
<
numOfSub
;
++
j
)
{
...
...
@@ -93,12 +93,12 @@ static int32_t getTableNameFromSubquery(SSqlNode* pSqlNode, SArray* tableNameLis
for
(
int32_t
i
=
0
;
i
<
num
;
++
i
)
{
SSqlNode
*
p
=
taosArrayGetP
(
sub
->
pSubquery
,
i
);
if
(
p
->
from
->
type
==
SQL_NODE_FROM_TABLELIST
)
{
int32_t
code
=
getTableNameFromSqlNode
(
p
,
tableNameList
,
msgBuf
,
msgBufLen
);
int32_t
code
=
getTableNameFromSqlNode
(
p
,
tableNameList
,
pMsgBuf
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
}
else
{
getTableNameFromSubquery
(
p
,
tableNameList
,
msgBuf
,
msgBufLen
);
getTableNameFromSubquery
(
p
,
tableNameList
,
pMsgBuf
);
}
}
}
...
...
@@ -106,7 +106,7 @@ static int32_t getTableNameFromSubquery(SSqlNode* pSqlNode, SArray* tableNameLis
return
TSDB_CODE_SUCCESS
;
}
int32_t
getTableNameFromSqlNode
(
SSqlNode
*
pSqlNode
,
SArray
*
tableNameList
,
char
*
msg
,
int32_t
msgBufLen
)
{
int32_t
getTableNameFromSqlNode
(
SSqlNode
*
pSqlNode
,
SArray
*
tableNameList
,
SMsgBuf
*
pMsgBuf
)
{
const
char
*
msg1
=
"invalid table name"
;
int32_t
numOfTables
=
(
int32_t
)
taosArrayGetSize
(
pSqlNode
->
from
->
list
);
...
...
@@ -117,12 +117,12 @@ int32_t getTableNameFromSqlNode(SSqlNode* pSqlNode, SArray* tableNameList, char*
SToken
*
t
=
&
item
->
tableName
;
if
(
t
->
type
==
TK_INTEGER
||
t
->
type
==
TK_FLOAT
||
t
->
type
==
TK_STRING
)
{
return
buildInvalidOperationMsg
(
msg
,
msgBufLen
,
msg1
);
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg1
);
}
// tscDequoteAndTrimToken(t);
if
(
parserValidateIdToken
(
t
)
!=
TSDB_CODE_SUCCESS
)
{
return
buildInvalidOperationMsg
(
msg
,
msgBufLen
,
msg1
);
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg1
);
}
SName
name
=
{
0
};
...
...
@@ -143,6 +143,7 @@ static void freePtrElem(void* p) {
int32_t
qParserExtractRequestedMetaInfo
(
const
SSqlInfo
*
pSqlInfo
,
SMetaReq
*
pMetaInfo
,
char
*
msg
,
int32_t
msgBufLen
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
SMsgBuf
msgBuf
=
{.
buf
=
msg
,
.
len
=
msgBufLen
};
pMetaInfo
->
pTableName
=
taosArrayInit
(
4
,
sizeof
(
SName
));
pMetaInfo
->
pUdf
=
taosArrayInit
(
4
,
POINTER_BYTES
);
...
...
@@ -151,17 +152,17 @@ int32_t qParserExtractRequestedMetaInfo(const SSqlInfo* pSqlInfo, SMetaReq* pMet
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SSqlNode
*
pSqlNode
=
taosArrayGetP
(
pSqlInfo
->
list
,
i
);
if
(
pSqlNode
->
from
==
NULL
)
{
return
buildInvalidOperationMsg
(
msg
,
msgBufLen
,
"invalid from clause"
);
return
buildInvalidOperationMsg
(
&
msgBuf
,
"invalid from clause"
);
}
// load the table meta in the FROM clause
if
(
pSqlNode
->
from
->
type
==
SQL_NODE_FROM_TABLELIST
)
{
code
=
getTableNameFromSqlNode
(
pSqlNode
,
pMetaInfo
->
pTableName
,
msg
,
msgBufLen
);
code
=
getTableNameFromSqlNode
(
pSqlNode
,
pMetaInfo
->
pTableName
,
&
msgBuf
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
}
else
{
code
=
getTableNameFromSubquery
(
pSqlNode
,
pMetaInfo
->
pTableName
,
msg
,
msgBufLen
);
code
=
getTableNameFromSubquery
(
pSqlNode
,
pMetaInfo
->
pTableName
,
&
msgBuf
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
...
...
source/libs/parser/src/parserUtil.c
浏览文件 @
3f84c37d
...
...
@@ -78,8 +78,8 @@ int32_t parserValidateIdToken(SToken* pToken) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
buildInvalidOperationMsg
(
char
*
dst
,
int32_t
dstBufLen
,
const
char
*
msg
)
{
strncpy
(
dst
,
msg
,
dstBufL
en
);
int32_t
buildInvalidOperationMsg
(
SMsgBuf
*
pBuf
,
const
char
*
msg
)
{
strncpy
(
pBuf
->
buf
,
msg
,
pBuf
->
l
en
);
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
...
...
@@ -493,12 +493,25 @@ static void createInputDataFilterInfo(SQueryStmtInfo* px, int32_t numOfCol1, int
// return len;
//}
TAOS_FIELD
createField
(
int8_t
type
,
const
char
*
name
,
int16_t
bytes
)
{
TAOS_FIELD
f
=
{
.
type
=
type
,
.
bytes
=
bytes
,
};
tstrncpy
(
f
.
name
,
name
,
sizeof
(
f
.
name
));
TAOS_FIELD
createField
(
const
SSchema
*
pSchema
)
{
TAOS_FIELD
f
=
{
.
type
=
pSchema
->
type
,
.
bytes
=
pSchema
->
bytes
,
};
tstrncpy
(
f
.
name
,
pSchema
->
name
,
sizeof
(
f
.
name
));
return
f
;
}
void
setSchemaVal
(
SSchema
*
pSchema
,
uint8_t
type
,
int16_t
bytes
,
int16_t
colId
,
const
char
*
name
){
assert
(
pSchema
!=
NULL
);
pSchema
->
type
=
type
;
pSchema
->
bytes
=
bytes
;
pSchema
->
colId
=
colId
;
tstrncpy
(
pSchema
->
name
,
name
,
tListLen
(
pSchema
->
name
));
}
int32_t
getNumOfFields
(
SFieldInfo
*
pFieldInfo
)
{
return
pFieldInfo
->
numOfOutput
;
}
int32_t
getFirstInvisibleFieldPos
(
SQueryStmtInfo
*
pQueryInfo
)
{
if
(
pQueryInfo
->
fieldsInfo
.
numOfOutput
<=
0
||
pQueryInfo
->
fieldsInfo
.
internalField
==
NULL
)
{
return
0
;
...
...
@@ -524,11 +537,14 @@ SInternalField* appendFieldInfo(SFieldInfo* pFieldInfo, TAOS_FIELD* pField) {
return
taosArrayPush
(
pFieldInfo
->
internalField
,
&
info
);
}
SInternalField
*
insertFieldInfo
(
SFieldInfo
*
pFieldInfo
,
int32_t
index
,
TAOS_FIELD
*
field
)
{
SInternalField
*
insertFieldInfo
(
SFieldInfo
*
pFieldInfo
,
int32_t
index
,
SSchema
*
pSchema
)
{
pFieldInfo
->
numOfOutput
++
;
struct
SInternalField
info
=
{
.
pExpr
=
NULL
,
.
visible
=
true
};
info
.
field
=
*
field
;
info
.
field
.
type
=
pSchema
->
type
;
info
.
field
.
bytes
=
pSchema
->
bytes
;
tstrncpy
(
info
.
field
.
name
,
pSchema
->
name
,
tListLen
(
pSchema
->
name
));
return
taosArrayInsert
(
pFieldInfo
->
internalField
,
index
,
&
info
);
}
...
...
@@ -539,12 +555,12 @@ void fieldInfoUpdateOffset(SQueryStmtInfo* pQueryInfo) {
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
p
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
i
);
p
->
base
.
offset
=
offset
;
offset
+=
p
->
base
.
res
B
ytes
;
//
p->base.offset = offset;
offset
+=
p
->
base
.
res
Schema
.
b
ytes
;
}
}
SInternalField
*
fieldInfoG
etInternalField
(
SFieldInfo
*
pFieldInfo
,
int32_t
index
)
{
SInternalField
*
g
etInternalField
(
SFieldInfo
*
pFieldInfo
,
int32_t
index
)
{
assert
(
index
<
pFieldInfo
->
numOfOutput
);
return
TARRAY_GET_ELEM
(
pFieldInfo
->
internalField
,
index
);
}
...
...
@@ -555,10 +571,10 @@ TAOS_FIELD* getFieldInfo(SFieldInfo* pFieldInfo, int32_t index) {
}
int16_t
getFieldInfoOffset
(
SQueryStmtInfo
*
pQueryInfo
,
int32_t
index
)
{
SInternalField
*
pInfo
=
fieldInfoG
etInternalField
(
&
pQueryInfo
->
fieldsInfo
,
index
);
SInternalField
*
pInfo
=
g
etInternalField
(
&
pQueryInfo
->
fieldsInfo
,
index
);
assert
(
pInfo
!=
NULL
&&
pInfo
->
pExpr
->
pExpr
==
NULL
);
return
pInfo
->
pExpr
->
base
.
offset
;
return
0
;
//
return pInfo->pExpr->base.offset;
}
int32_t
fieldInfoCompare
(
const
SFieldInfo
*
pFieldInfo1
,
const
SFieldInfo
*
pFieldInfo2
,
int32_t
*
diffSize
)
{
...
...
@@ -659,10 +675,10 @@ void copyFieldInfo(SFieldInfo* pFieldInfo, const SFieldInfo* pSrc, const SArray*
SInternalField
p
=
{.
visible
=
pfield
->
visible
,
.
field
=
pfield
->
field
};
bool
found
=
false
;
int32_t
resColId
=
pfield
->
pExpr
->
base
.
res
C
olId
;
int32_t
resColId
=
pfield
->
pExpr
->
base
.
res
Schema
.
c
olId
;
for
(
int32_t
j
=
0
;
j
<
numOfExpr
;
++
j
)
{
SExprInfo
*
pExpr
=
taosArrayGetP
(
pExprList
,
j
);
if
(
pExpr
->
base
.
res
C
olId
==
resColId
)
{
if
(
pExpr
->
base
.
res
Schema
.
c
olId
==
resColId
)
{
p
.
pExpr
=
pExpr
;
found
=
true
;
break
;
...
...
@@ -757,6 +773,11 @@ SColumn* columnListInsert(SArray* pColumnList, int32_t columnIndex, uint64_t uid
return
taosArrayGetP
(
pColumnList
,
i
);
}
SColumn
*
insertPrimaryTsColumn
(
SArray
*
pColumnList
,
uint64_t
tableUid
)
{
SSchema
s
=
{.
type
=
TSDB_DATA_TYPE_TIMESTAMP
,
.
bytes
=
TSDB_KEYSIZE
,
.
colId
=
PRIMARYKEY_TIMESTAMP_COL_INDEX
};
return
columnListInsert
(
pColumnList
,
PRIMARYKEY_TIMESTAMP_COL_INDEX
,
tableUid
,
&
s
);
}
void
columnCopy
(
SColumn
*
pDest
,
const
SColumn
*
pSrc
);
SColumn
*
columnClone
(
const
SColumn
*
src
)
{
...
...
@@ -771,6 +792,30 @@ SColumn* columnClone(const SColumn* src) {
return
dst
;
}
SColumnFilterInfo
*
tFilterInfoDup
(
const
SColumnFilterInfo
*
src
,
int32_t
numOfFilters
)
{
if
(
numOfFilters
==
0
||
src
==
NULL
)
{
assert
(
src
==
NULL
);
return
NULL
;
}
SColumnFilterInfo
*
pFilter
=
calloc
(
1
,
numOfFilters
*
sizeof
(
SColumnFilterInfo
));
memcpy
(
pFilter
,
src
,
sizeof
(
SColumnFilterInfo
)
*
numOfFilters
);
for
(
int32_t
j
=
0
;
j
<
numOfFilters
;
++
j
)
{
if
(
pFilter
[
j
].
filterstr
)
{
size_t
len
=
(
size_t
)
pFilter
[
j
].
len
+
1
*
TSDB_NCHAR_SIZE
;
pFilter
[
j
].
pz
=
(
int64_t
)
calloc
(
1
,
len
);
memcpy
((
char
*
)
pFilter
[
j
].
pz
,
(
char
*
)
src
[
j
].
pz
,
(
size_t
)
pFilter
[
j
].
len
);
}
}
assert
(
src
->
filterstr
==
0
||
src
->
filterstr
==
1
);
assert
(
!
(
src
->
lowerRelOptr
==
TSDB_RELATION_INVALID
&&
src
->
upperRelOptr
==
TSDB_RELATION_INVALID
));
return
pFilter
;
}
void
columnCopy
(
SColumn
*
pDest
,
const
SColumn
*
pSrc
)
{
destroyFilterInfo
(
&
pDest
->
info
.
flist
);
...
...
@@ -1238,7 +1283,7 @@ static void doSetSqlExprAndResultFieldInfo(SQueryStmtInfo* pNewQueryInfo, int64_
for
(
int32_t
i
=
0
;
i
<
numOfOutput
;
++
i
)
{
SExprInfo
*
pExpr
=
getExprInfo
(
pNewQueryInfo
,
i
);
TAOS_FIELD
f
=
createField
(
(
int8_t
)
pExpr
->
base
.
resType
,
pExpr
->
base
.
aliasName
,
pExpr
->
base
.
resBytes
);
TAOS_FIELD
f
=
createField
(
&
pExpr
->
base
.
resSchema
);
SInternalField
*
pInfo1
=
appendFieldInfo
(
&
pNewQueryInfo
->
fieldsInfo
,
&
f
);
pInfo1
->
pExpr
=
pExpr
;
}
...
...
@@ -1252,7 +1297,7 @@ static void doSetSqlExprAndResultFieldInfo(SQueryStmtInfo* pNewQueryInfo, int64_
for
(
int32_t
k1
=
0
;
k1
<
numOfOutput
;
++
k1
)
{
SExprInfo
*
pExpr1
=
getExprInfo
(
pNewQueryInfo
,
k1
);
if
(
strcmp
(
field
->
name
,
pExpr1
->
base
.
aliasN
ame
)
==
0
)
{
// establish link according to the result field name
if
(
strcmp
(
field
->
name
,
pExpr1
->
base
.
resSchema
.
n
ame
)
==
0
)
{
// establish link according to the result field name
SInternalField
*
pInfo
=
getInternalFieldInfo
(
&
pNewQueryInfo
->
fieldsInfo
,
f
);
pInfo
->
pExpr
=
pExpr1
;
...
...
@@ -1446,11 +1491,12 @@ int32_t getNumOfOutput(SFieldInfo* pFieldInfo) {
return
pFieldInfo
->
numOfOutput
;
}
// todo move to planner module
int32_t
createProjectionExpr
(
SQueryStmtInfo
*
pQueryInfo
,
STableMetaInfo
*
pTableMetaInfo
,
SExprInfo
***
pExpr
,
int32_t
*
num
)
{
// if (!pQueryInfo->arithmeticOnAgg) {
// return TSDB_CODE_SUCCESS;
// }
#if 0
*num = getNumOfOutput(pQueryInfo);
*pExpr = calloc(*(num), POINTER_BYTES);
if ((*pExpr) == NULL) {
...
...
@@ -1466,28 +1512,24 @@ int32_t createProjectionExpr(SQueryStmtInfo* pQueryInfo, STableMetaInfo* pTableM
SSqlExpr *pse = &px->base;
pse->uid = pTableMetaInfo->pTableMeta->uid;
pse
->
resColId
=
pSource
->
base
.
resColId
;
strncpy
(
pse
->
aliasName
,
pSource
->
base
.
aliasName
,
tListLen
(
pse
->
aliasName
));
strncpy
(
pse
->
token
,
pSource
->
base
.
token
,
tListLen
(
pse
->
token
));
memcpy(&pse->resSchema, &pSource->base.resSchema, sizeof(SSchema));
if (pSource->base.functionId != FUNCTION_ARITHM) { // this should be switched to projection query
pse->numOfParams = 0; // no params for projection query
pse->functionId = FUNCTION_PRJ;
pse
->
colInfo
.
colId
=
pSource
->
base
.
res
C
olId
;
pse->colInfo.colId = pSource->base.res
Schema.c
olId;
int32_t numOfOutput = (int32_t) taosArrayGetSize(pQueryInfo->exprList);
for (int32_t j = 0; j < numOfOutput; ++j) {
SExprInfo* p = taosArrayGetP(pQueryInfo->exprList, j);
if
(
p
->
base
.
res
C
olId
==
pse
->
colInfo
.
colId
)
{
if (p->base.res
Schema.c
olId == pse->colInfo.colId) {
pse->colInfo.colIndex = j;
break;
}
}
pse->colInfo.flag = TSDB_COL_NORMAL;
pse
->
resType
=
pSource
->
base
.
resType
;
pse
->
resBytes
=
pSource
->
base
.
resBytes
;
strncpy
(
pse
->
colInfo
.
name
,
pSource
->
base
.
aliasName
,
tListLen
(
pse
->
colInfo
.
name
));
strncpy(pse->colInfo.name, pSource->base.resSchema.name, tListLen(pse->colInfo.name));
// TODO restore refactor
int32_t functionId = pSource->base.functionId;
...
...
@@ -1500,17 +1542,17 @@ int32_t createProjectionExpr(SQueryStmtInfo* pQueryInfo, STableMetaInfo* pTableM
}
int32_t inter = 0;
getResultDataInfo
(
pSource
->
base
.
colType
,
pSource
->
base
.
colBytes
,
functionId
,
0
,
&
pse
->
res
T
ype
,
&
pse
->
res
B
ytes
,
&
inter
,
0
,
false
/*, NULL*/
);
pse
->
colType
=
pse
->
res
T
ype
;
pse
->
colBytes
=
pse
->
res
B
ytes
;
getResultDataInfo(pSource->base.colType, pSource->base.colBytes, functionId, 0, &pse->res
Schema.t
ype,
&pse->res
Schema.b
ytes, &inter, 0, false/*, NULL*/);
pse->colType = pse->res
Schema.t
ype;
pse->colBytes = pse->res
Schema.b
ytes;
} else { // arithmetic expression
pse->colInfo.colId = pSource->base.colInfo.colId;
pse->colType = pSource->base.colType;
pse->colBytes = pSource->base.colBytes;
pse
->
res
B
ytes
=
sizeof
(
double
);
pse
->
res
T
ype
=
TSDB_DATA_TYPE_DOUBLE
;
pse->res
Schema.b
ytes = sizeof(double);
pse->res
Schema.t
ype = TSDB_DATA_TYPE_DOUBLE;
pse->functionId = pSource->base.functionId;
pse->numOfParams = pSource->base.numOfParams;
...
...
@@ -1521,7 +1563,7 @@ int32_t createProjectionExpr(SQueryStmtInfo* pQueryInfo, STableMetaInfo* pTableM
}
}
}
#endif
return
TSDB_CODE_SUCCESS
;
}
...
...
source/libs/parser/src/queryInfoUtil.c
浏览文件 @
3f84c37d
#include "queryInfoUtil.h"
#include
"tmsgtype.h"
#include
<function.h>
#include "astGenerator.h"
#include "function.h"
#include "os.h"
#include "parser.h"
#include "parserInt.h"
...
...
@@ -54,56 +55,66 @@ SSchema* getTableTagSchema(const STableMeta* pTableMeta) {
return
getOneColumnSchema
(
pTableMeta
,
getTableInfo
(
pTableMeta
).
numOfColumns
);
}
SExprInfo
*
createExprInfo
(
STableMetaInfo
*
pTableMetaInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
int16_t
size
,
int16_t
resColId
,
int16_t
interSize
,
int32_t
colType
)
{
static
tExprNode
*
createUnaryFunctionExprNode
(
int32_t
functionId
,
SSchema
*
pSchema
)
{
tExprNode
*
pColumnNode
=
calloc
(
1
,
sizeof
(
tExprNode
));
pColumnNode
->
nodeType
=
TEXPR_COL_NODE
;
pColumnNode
->
pSchema
=
calloc
(
1
,
sizeof
(
SSchema
));
memcpy
(
pColumnNode
->
pSchema
,
pSchema
,
sizeof
(
SSchema
));
tExprNode
*
pNode
=
calloc
(
1
,
sizeof
(
tExprNode
));
pNode
->
nodeType
=
TEXPR_UNARYEXPR_NODE
;
pNode
->
_node
.
functionId
=
functionId
;
pNode
->
_node
.
pLeft
=
pColumnNode
;
return
pNode
;
}
SExprInfo
*
createExprInfo
(
STableMetaInfo
*
pTableMetaInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
SSchema
*
pResSchema
,
int16_t
interSize
)
{
SExprInfo
*
pExpr
=
calloc
(
1
,
sizeof
(
SExprInfo
));
if
(
pExpr
==
NULL
)
{
return
NULL
;
}
SSqlExpr
*
p
=
&
pExpr
->
base
;
p
->
functionId
=
functionId
;
// set the correct columnIndex index
if
(
pColIndex
->
columnIndex
==
TSDB_TBNAME_COLUMN_INDEX
)
{
SSchema
*
s
=
getTbnameColumnSchema
();
p
->
colInfo
.
colId
=
TSDB_TBNAME_COLUMN_INDEX
;
p
->
colBytes
=
s
->
bytes
;
p
->
colType
=
s
->
type
;
pExpr
->
pExpr
=
createUnaryFunctionExprNode
(
functionId
,
s
);
}
else
if
(
pColIndex
->
columnIndex
<=
TSDB_UD_COLUMN_INDEX
)
{
p
->
colInfo
.
colId
=
pColIndex
->
columnIndex
;
p
->
colBytes
=
size
;
p
->
colType
=
type
;
}
else
if
(
functionId
==
0
/*TSDB_FUNC_BLKINFO*/
)
{
assert
(
0
);
SSchema
s
=
{.
colId
=
pColIndex
->
columnIndex
,
.
bytes
=
pResSchema
->
bytes
,
.
type
=
pResSchema
->
type
}
;
tstrncpy
(
s
.
name
,
pResSchema
->
name
,
TSDB_COL_NAME_LEN
)
;
pExpr
->
pExpr
=
createUnaryFunctionExprNode
(
functionId
,
&
s
);
}
else
if
(
functionId
==
FUNCTION_BLKINFO
)
{
p
->
colInfo
.
colId
=
pColIndex
->
columnIndex
;
p
->
colBytes
=
TSDB_MAX_BINARY_LEN
;
p
->
colType
=
TSDB_DATA_TYPE_BINARY
;
SSchema
s
=
{.
colId
=
pColIndex
->
columnIndex
,
.
bytes
=
pResSchema
->
bytes
,
.
type
=
pResSchema
->
type
};
tstrncpy
(
s
.
name
,
pResSchema
->
name
,
TSDB_COL_NAME_LEN
);
pExpr
->
pExpr
=
createUnaryFunctionExprNode
(
functionId
,
&
s
);
// p->colBytes = TSDB_MAX_BINARY_LEN;
// p->colType = TSDB_DATA_TYPE_BINARY;
}
else
{
int32_t
len
=
tListLen
(
p
->
colInfo
.
name
);
if
(
TSDB_COL_IS_TAG
(
colT
ype
))
{
if
(
TSDB_COL_IS_TAG
(
pColIndex
->
t
ype
))
{
SSchema
*
pSchema
=
getTableTagSchema
(
pTableMetaInfo
->
pTableMeta
);
p
->
colInfo
.
colId
=
pSchema
[
pColIndex
->
columnIndex
].
colId
;
p
->
colBytes
=
pSchema
[
pColIndex
->
columnIndex
].
bytes
;
p
->
colType
=
pSchema
[
pColIndex
->
columnIndex
].
type
;
pExpr
->
pExpr
=
createUnaryFunctionExprNode
(
functionId
,
&
pSchema
[
pColIndex
->
columnIndex
]);
snprintf
(
p
->
colInfo
.
name
,
len
,
"%s.%s"
,
pTableMetaInfo
->
aliasName
,
pSchema
[
pColIndex
->
columnIndex
].
name
);
}
else
if
(
pTableMetaInfo
->
pTableMeta
!=
NULL
)
{
// in handling select database/version/server_status(), the pTableMeta is NULL
SSchema
*
pSchema
=
getOneColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
pColIndex
->
columnIndex
);
p
->
colInfo
.
colId
=
pSchema
->
colId
;
p
->
colBytes
=
pSchema
->
bytes
;
p
->
colType
=
pSchema
->
type
;
snprintf
(
p
->
colInfo
.
name
,
len
,
"%s.%s"
,
pTableMetaInfo
->
aliasName
,
pSchema
->
name
);
pExpr
->
pExpr
=
createUnaryFunctionExprNode
(
functionId
,
pSchema
);
}
}
p
->
colInfo
.
flag
=
colT
ype
;
p
->
colInfo
.
flag
=
pColIndex
->
t
ype
;
p
->
colInfo
.
colIndex
=
pColIndex
->
columnIndex
;
p
->
resType
=
type
;
p
->
resBytes
=
size
;
p
->
resColId
=
resColId
;
p
->
interBytes
=
interSize
;
p
->
interBytes
=
interSize
;
memcpy
(
&
p
->
resSchema
,
pResSchema
,
sizeof
(
SSchema
));
if
(
pTableMetaInfo
->
pTableMeta
)
{
p
->
uid
=
pTableMetaInfo
->
pTableMeta
->
uid
;
...
...
@@ -127,12 +138,12 @@ void updateExprInfo(SExprInfo* pExprInfo, int16_t functionId, int32_t colId, int
assert
(
pExprInfo
!=
NULL
);
SSqlExpr
*
pse
=
&
pExprInfo
->
base
;
p
se
->
functionId
=
functionId
;
p
ExprInfo
->
pExpr
->
_node
.
functionId
=
functionId
;
pse
->
colInfo
.
colIndex
=
srcColumnIndex
;
pse
->
colInfo
.
colId
=
colId
;
pse
->
res
T
ype
=
resType
;
pse
->
res
B
ytes
=
resSize
;
pse
->
colInfo
.
colId
=
colId
;
pse
->
res
Schema
.
t
ype
=
resType
;
pse
->
res
Schema
.
b
ytes
=
resSize
;
}
SExprInfo
*
getExprInfo
(
SQueryStmtInfo
*
pQueryInfo
,
int32_t
index
)
{
...
...
@@ -145,13 +156,13 @@ void destroyExprInfo(SArray* pExprInfo) {
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
taosArrayGetP
(
pExprInfo
,
i
);
tSqlExprDestroy
(
&
pExpr
->
base
);
//
tSqlExprDestroy(&pExpr->base);
}
taosArrayDestroy
(
pExprInfo
);
}
void
addExprParam
(
SSqlExpr
*
pExpr
,
char
*
argument
,
int32_t
type
,
int32_t
bytes
)
{
void
addExpr
Info
Param
(
SSqlExpr
*
pExpr
,
char
*
argument
,
int32_t
type
,
int32_t
bytes
)
{
assert
(
pExpr
!=
NULL
||
argument
!=
NULL
||
bytes
!=
0
);
// set parameter value
...
...
@@ -166,11 +177,12 @@ void assignExprInfo(SExprInfo* dst, const SExprInfo* src) {
assert
(
dst
!=
NULL
&&
src
!=
NULL
);
*
dst
=
*
src
;
#if 0
if (src->base.flist.numOfFilters > 0) {
dst->base.flist.filterInfo = calloc(src->base.flist.numOfFilters, sizeof(SColumnFilterInfo));
memcpy(dst->base.flist.filterInfo, src->base.flist.filterInfo, sizeof(SColumnFilterInfo) * src->base.flist.numOfFilters);
}
#endif
assert
(
0
);
// dst->pExpr = exprdup(src->pExpr);
...
...
@@ -252,7 +264,7 @@ int32_t getResRowLength(SArray* pExprList) {
int32_t
size
=
0
;
for
(
int32_t
i
=
0
;
i
<
num
;
++
i
)
{
SExprInfo
*
pExpr
=
taosArrayGetP
(
pExprList
,
i
);
size
+=
pExpr
->
base
.
res
B
ytes
;
size
+=
pExpr
->
base
.
res
Schema
.
b
ytes
;
}
return
size
;
...
...
@@ -316,33 +328,12 @@ SArray* extractFunctionIdList(SArray* pExprInfoList) {
SArray
*
p
=
taosArrayInit
(
len
,
sizeof
(
int16_t
));
for
(
int32_t
i
=
0
;
i
<
len
;
++
i
)
{
SExprInfo
*
pExprInfo
=
taosArrayGetP
(
pExprInfoList
,
i
);
taosArrayPush
(
p
,
&
pExprInfo
->
bas
e
.
functionId
);
taosArrayPush
(
p
,
&
pExprInfo
->
pExpr
->
_nod
e
.
functionId
);
}
return
p
;
}
bool
tscIsProjectionQueryOnSTable
(
SQueryStmtInfo
*
pQueryInfo
,
int32_t
tableIndex
);
bool
tscNonOrderedProjectionQueryOnSTable
(
SQueryStmtInfo
*
pQueryInfo
,
int32_t
tableIndex
)
{
if
(
!
tscIsProjectionQueryOnSTable
(
pQueryInfo
,
tableIndex
))
{
return
false
;
}
// order by columnIndex exists, not a non-ordered projection query
return
pQueryInfo
->
order
.
orderColId
<
0
;
}
// not order by timestamp projection query on super table
bool
tscOrderedProjectionQueryOnSTable
(
SQueryStmtInfo
*
pQueryInfo
,
int32_t
tableIndex
)
{
if
(
!
tscIsProjectionQueryOnSTable
(
pQueryInfo
,
tableIndex
))
{
return
false
;
}
// order by columnIndex exists, a non-ordered projection query
return
pQueryInfo
->
order
.
orderColId
>=
0
;
}
bool
tscHasColumnFilter
(
SQueryStmtInfo
*
pQueryInfo
)
{
// filter on primary timestamp column
if
(
pQueryInfo
->
window
.
skey
!=
INT64_MIN
||
pQueryInfo
->
window
.
ekey
!=
INT64_MAX
)
{
...
...
source/libs/parser/test/tokenizerTest.cpp
浏览文件 @
3f84c37d
...
...
@@ -673,13 +673,18 @@ TEST(testCase, generateAST_test) {
ASSERT_EQ
(
info1
.
valid
,
true
);
char
msg
[
128
]
=
{
0
};
SMsgBuf
msgBuf
=
{
0
};
msgBuf
.
buf
=
msg
;
msgBuf
.
len
=
128
;
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
msg
,
sizeof
(
msg
)
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
msgBuf
);
ASSERT_EQ
(
code
,
0
);
SSqlInfo
info2
=
doGenerateAST
(
"select * from abc where ts<now+2"
);
SSqlNode
*
pNode2
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info2
.
list
),
0
);
code
=
evaluateSqlNode
(
pNode2
,
TSDB_TIME_PRECISION_MILLI
,
msg
,
sizeof
(
msg
)
);
code
=
evaluateSqlNode
(
pNode2
,
TSDB_TIME_PRECISION_MILLI
,
&
msgBuf
);
ASSERT_NE
(
code
,
0
);
}
...
...
@@ -688,8 +693,12 @@ TEST(testCase, evaluateAST_test) {
ASSERT_EQ
(
info1
.
valid
,
true
);
char
msg
[
128
]
=
{
0
};
SMsgBuf
msgBuf
=
{
0
};
msgBuf
.
buf
=
msg
;
msgBuf
.
len
=
128
;
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
msg
,
sizeof
(
msg
)
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
msgBuf
);
ASSERT_EQ
(
code
,
0
);
...
...
source/libs/planner/inc/plannerInt.h
浏览文件 @
3f84c37d
...
...
@@ -50,9 +50,9 @@ typedef struct SQueryNode {
struct
SQueryNode
*
nextNode
;
}
SQueryNode
;
typedef
struct
SQuery
Phy
Node
{
typedef
struct
SQuery
DistPlan
Node
{
}
SQuery
Phy
Node
;
}
SQuery
DistPlan
Node
;
#ifdef __cplusplus
}
...
...
source/libs/planner/src/planner.c
浏览文件 @
3f84c37d
...
...
@@ -33,11 +33,11 @@ int32_t qQueryPlanToSql(struct SQueryNode* pQueryNode, char** sql) {
return
0
;
}
int32_t
qCreatePhysicalPlan
(
struct
SQueryNode
*
pQueryNode
,
struct
SEpSet
*
pQnode
,
struct
SQuery
Phy
Node
*
pPhyNode
)
{
int32_t
qCreatePhysicalPlan
(
struct
SQueryNode
*
pQueryNode
,
struct
SEpSet
*
pQnode
,
struct
SQuery
DistPlan
Node
*
pPhyNode
)
{
return
0
;
}
int32_t
qPhyPlanToString
(
struct
SQuery
Phy
Node
*
pPhyNode
,
char
**
str
)
{
int32_t
qPhyPlanToString
(
struct
SQuery
DistPlan
Node
*
pPhyNode
,
char
**
str
)
{
return
0
;
}
...
...
@@ -45,10 +45,10 @@ void* qDestroyQueryPlan(struct SQueryNode* pQueryNode) {
return
NULL
;
}
void
*
qDestroyQueryPhyPlan
(
struct
SQuery
Phy
Node
*
pQueryPhyNode
)
{
void
*
qDestroyQueryPhyPlan
(
struct
SQuery
DistPlan
Node
*
pQueryPhyNode
)
{
return
NULL
;
}
int32_t
qCreateQueryJob
(
const
struct
SQuery
Phy
Node
*
pPhyNode
,
struct
SQueryJob
**
pJob
)
{
int32_t
qCreateQueryJob
(
const
struct
SQuery
DistPlan
Node
*
pPhyNode
,
struct
SQueryJob
**
pJob
)
{
return
0
;
}
\ No newline at end of file
src/query/tests/astTest.cpp
浏览文件 @
3f84c37d
...
...
@@ -459,7 +459,7 @@ namespace {
// two level expression tree
tExprNode *createExpr1() {
auto *pLeft = (tExprNode*) calloc(1, sizeof(tExprNode));
pLeft->nodeType = T
SQL_NODE_COL
;
pLeft->nodeType = T
EXPR_COL_NODE
;
pLeft->pSchema = (SSchema*) calloc(1, sizeof(SSchema));
strcpy(pLeft->pSchema->name, "col_a");
...
...
@@ -468,14 +468,14 @@ tExprNode *createExpr1() {
pLeft->pSchema->colId = 1;
auto *pRight = (tExprNode*) calloc(1, sizeof(tExprNode));
pRight->nodeType = T
SQL_NODE_VALU
E;
pRight->nodeType = T
EXPR_VALUE_NOD
E;
pRight->pVal = (tVariant*) calloc(1, sizeof(tVariant));
pRight->pVal->nType = TSDB_DATA_TYPE_INT;
pRight->pVal->i64 = 12;
auto *pRoot = (tExprNode*) calloc(1, sizeof(tExprNode));
pRoot->nodeType = T
SQL
_NODE_EXPR;
pRoot->nodeType = T
EXPR
_NODE_EXPR;
pRoot->_node.optr = TSDB_RELATION_EQUAL;
pRoot->_node.pLeft = pLeft;
...
...
@@ -488,7 +488,7 @@ tExprNode *createExpr1() {
// thress level expression tree
tExprNode* createExpr2() {
auto *pLeft2 = (tExprNode*) calloc(1, sizeof(tExprNode));
pLeft2->nodeType = T
SQL_NODE_COL
;
pLeft2->nodeType = T
EXPR_COL_NODE
;
pLeft2->pSchema = (SSchema*) calloc(1, sizeof(SSchema));
strcpy(pLeft2->pSchema->name, "col_a");
...
...
@@ -497,7 +497,7 @@ tExprNode* createExpr2() {
pLeft2->pSchema->colId = 1;
auto *pRight2 = (tExprNode*) calloc(1, sizeof(tExprNode));
pRight2->nodeType = T
SQL_NODE_VALU
E;
pRight2->nodeType = T
EXPR_VALUE_NOD
E;
pRight2->pVal = (tVariant*) calloc(1, sizeof(tVariant));
pRight2->pVal->nType = TSDB_DATA_TYPE_BINARY;
...
...
@@ -506,7 +506,7 @@ tExprNode* createExpr2() {
pRight2->pVal->nLen = strlen(v);
auto *p1 = (tExprNode*) calloc(1, sizeof(tExprNode));
p1->nodeType = T
SQL
_NODE_EXPR;
p1->nodeType = T
EXPR
_NODE_EXPR;
p1->_node.optr = TSDB_RELATION_LIKE;
p1->_node.pLeft = pLeft2;
...
...
@@ -514,7 +514,7 @@ tExprNode* createExpr2() {
p1->_node.hasPK = false;
auto *pLeft1 = (tExprNode*) calloc(1, sizeof(tExprNode));
pLeft1->nodeType = T
SQL_NODE_COL
;
pLeft1->nodeType = T
EXPR_COL_NODE
;
pLeft1->pSchema = (SSchema*) calloc(1, sizeof(SSchema));
strcpy(pLeft1->pSchema->name, "col_b");
...
...
@@ -523,14 +523,14 @@ tExprNode* createExpr2() {
pLeft1->pSchema->colId = 99;
auto *pRight1 = (tExprNode*) calloc(1, sizeof(tExprNode));
pRight1->nodeType = T
SQL_NODE_VALU
E;
pRight1->nodeType = T
EXPR_VALUE_NOD
E;
pRight1->pVal = (tVariant*) calloc(1, sizeof(tVariant));
pRight1->pVal->nType = TSDB_DATA_TYPE_DOUBLE;
pRight1->pVal->dKey = 91.99;
auto *p2 = (tExprNode*) calloc(1, sizeof(tExprNode));
p2->nodeType = T
SQL
_NODE_EXPR;
p2->nodeType = T
EXPR
_NODE_EXPR;
p2->_node.optr = TSDB_RELATION_GREATER_EQUAL;
p2->_node.pLeft = pLeft1;
...
...
@@ -538,7 +538,7 @@ tExprNode* createExpr2() {
p2->_node.hasPK = false;
auto *pRoot = (tExprNode*) calloc(1, sizeof(tExprNode));
pRoot->nodeType = T
SQL
_NODE_EXPR;
pRoot->nodeType = T
EXPR
_NODE_EXPR;
pRoot->_node.optr = TSDB_RELATION_OR;
pRoot->_node.pLeft = p1;
...
...
@@ -605,11 +605,11 @@ void exprSerializeTest2() {
ASSERT_EQ(c1Left->nodeType, c2Left->nodeType);
ASSERT_EQ(c2Left->nodeType, T
SQL
_NODE_EXPR);
ASSERT_EQ(c2Left->nodeType, T
EXPR
_NODE_EXPR);
ASSERT_EQ(c2Left->_node.optr, TSDB_RELATION_LIKE);
ASSERT_STRCASEEQ(c2Left->_node.pLeft->pSchema->name, "col_a");
ASSERT_EQ(c2Left->_node.pRight->nodeType, T
SQL_NODE_VALU
E);
ASSERT_EQ(c2Left->_node.pRight->nodeType, T
EXPR_VALUE_NOD
E);
ASSERT_STRCASEEQ(c2Left->_node.pRight->pVal->pz, "hello world!");
...
...
@@ -617,7 +617,7 @@ void exprSerializeTest2() {
tExprNode* c2Right = p2->_node.pRight;
ASSERT_EQ(c1Right->nodeType, c2Right->nodeType);
ASSERT_EQ(c2Right->nodeType, T
SQL
_NODE_EXPR);
ASSERT_EQ(c2Right->nodeType, T
EXPR
_NODE_EXPR);
ASSERT_EQ(c2Right->_node.optr, TSDB_RELATION_GREATER_EQUAL);
ASSERT_EQ(c2Right->_node.pRight->pVal->dKey, 91.99);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录