Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
0035bb11
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
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看板
未验证
提交
0035bb11
编写于
5月 05, 2022
作者:
X
Xiaoyu Wang
提交者:
GitHub
5月 05, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #12115 from taosdata/feature/3.0_wxy
fix: plan problem of tag scanning
上级
e882eea6
1361bf4e
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
142 addition
and
57 deletion
+142
-57
include/libs/parser/parser.h
include/libs/parser/parser.h
+36
-32
source/libs/function/src/builtins.c
source/libs/function/src/builtins.c
+1
-1
source/libs/parser/test/mockCatalog.cpp
source/libs/parser/test/mockCatalog.cpp
+22
-0
source/libs/planner/test/planSTableTest.cpp
source/libs/planner/test/planSTableTest.cpp
+2
-0
source/libs/planner/test/planTestMain.cpp
source/libs/planner/test/planTestMain.cpp
+2
-2
source/libs/planner/test/planTestUtil.cpp
source/libs/planner/test/planTestUtil.cpp
+78
-21
source/libs/planner/test/planTestUtil.h
source/libs/planner/test/planTestUtil.h
+1
-1
未找到文件。
include/libs/parser/parser.h
浏览文件 @
0035bb11
...
...
@@ -20,8 +20,8 @@
extern
"C"
{
#endif
#include "querynodes.h"
#include "query.h"
#include "querynodes.h"
typedef
struct
SStmtCallback
{
TAOS_STMT
*
pStmt
;
...
...
@@ -34,24 +34,26 @@ typedef struct SStmtCallback {
typedef
struct
SParseContext
{
uint64_t
requestId
;
int32_t
acctId
;
const
char
*
db
;
const
char
*
db
;
bool
topicQuery
;
void
*
pTransporter
;
void
*
pTransporter
;
SEpSet
mgmtEpSet
;
const
char
*
pSql
;
// sql string
size_t
sqlLen
;
// length of the sql string
char
*
pMsg
;
// extended error message if exists to help identifying the problem in sql statement.
int32_t
msgLen
;
// max length of the msg
struct
SCatalog
*
pCatalog
;
SStmtCallback
*
pStmtCb
;
const
char
*
pSql
;
// sql string
size_t
sqlLen
;
// length of the sql string
char
*
pMsg
;
// extended error message if exists to help identifying the problem in sql statement.
int32_t
msgLen
;
// max length of the msg
struct
SCatalog
*
pCatalog
;
SStmtCallback
*
pStmtCb
;
const
char
*
pUser
;
bool
isSuperUser
;
}
SParseContext
;
typedef
struct
SCmdMsgInfo
{
int16_t
msgType
;
SEpSet
epSet
;
void
*
pMsg
;
SEpSet
epSet
;
void
*
pMsg
;
int32_t
msgLen
;
void
*
pExtension
;
// todo remove it soon
void
*
pExtension
;
// todo remove it soon
}
SCmdMsgInfo
;
typedef
enum
EQueryExecMode
{
...
...
@@ -63,21 +65,21 @@ typedef enum EQueryExecMode {
typedef
struct
SQuery
{
EQueryExecMode
execMode
;
bool
haveResultSet
;
SNode
*
pRoot
;
int32_t
numOfResCols
;
SSchema
*
pResSchema
;
int8_t
precision
;
SCmdMsgInfo
*
pCmdMsg
;
int32_t
msgType
;
SArray
*
pDbList
;
SArray
*
pTableList
;
bool
showRewrite
;
int32_t
placeholderNum
;
bool
haveResultSet
;
SNode
*
pRoot
;
int32_t
numOfResCols
;
SSchema
*
pResSchema
;
int8_t
precision
;
SCmdMsgInfo
*
pCmdMsg
;
int32_t
msgType
;
SArray
*
pDbList
;
SArray
*
pTableList
;
bool
showRewrite
;
int32_t
placeholderNum
;
}
SQuery
;
int32_t
qParseQuerySql
(
SParseContext
*
pCxt
,
SQuery
**
pQuery
);
bool
isInsertSql
(
const
char
*
pStr
,
size_t
length
);
bool
isInsertSql
(
const
char
*
pStr
,
size_t
length
);
void
qDestroyQuery
(
SQuery
*
pQueryNode
);
...
...
@@ -89,14 +91,16 @@ int32_t qCloneStmtDataBlock(void** pDst, void* pSrc);
void
qFreeStmtDataBlock
(
void
*
pDataBlock
);
int32_t
qRebuildStmtDataBlock
(
void
**
pDst
,
void
*
pSrc
);
void
qDestroyStmtDataBlock
(
void
*
pBlock
);
int32_t
qBindStmtColsValue
(
void
*
pBlock
,
TAOS_MULTI_BIND
*
bind
,
char
*
msgBuf
,
int32_t
msgBufLen
);
int32_t
qBindStmtSingleColValue
(
void
*
pBlock
,
TAOS_MULTI_BIND
*
bind
,
char
*
msgBuf
,
int32_t
msgBufLen
,
int32_t
colIdx
,
int32_t
rowNum
);
int32_t
qBuildStmtColFields
(
void
*
pDataBlock
,
int32_t
*
fieldNum
,
TAOS_FIELD
**
fields
);
int32_t
qBuildStmtTagFields
(
void
*
pBlock
,
void
*
boundTags
,
int32_t
*
fieldNum
,
TAOS_FIELD
**
fields
);
int32_t
qBindStmtTagsValue
(
void
*
pBlock
,
void
*
boundTags
,
int64_t
suid
,
SName
*
pName
,
TAOS_MULTI_BIND
*
bind
,
char
*
msgBuf
,
int32_t
msgBufLen
);
void
destroyBoundColumnInfo
(
void
*
pBoundInfo
);
int32_t
qCreateSName
(
SName
*
pName
,
const
char
*
pTableName
,
int32_t
acctId
,
char
*
dbName
,
char
*
msgBuf
,
int32_t
msgBufLen
);
int32_t
qBindStmtColsValue
(
void
*
pBlock
,
TAOS_MULTI_BIND
*
bind
,
char
*
msgBuf
,
int32_t
msgBufLen
);
int32_t
qBindStmtSingleColValue
(
void
*
pBlock
,
TAOS_MULTI_BIND
*
bind
,
char
*
msgBuf
,
int32_t
msgBufLen
,
int32_t
colIdx
,
int32_t
rowNum
);
int32_t
qBuildStmtColFields
(
void
*
pDataBlock
,
int32_t
*
fieldNum
,
TAOS_FIELD
**
fields
);
int32_t
qBuildStmtTagFields
(
void
*
pBlock
,
void
*
boundTags
,
int32_t
*
fieldNum
,
TAOS_FIELD
**
fields
);
int32_t
qBindStmtTagsValue
(
void
*
pBlock
,
void
*
boundTags
,
int64_t
suid
,
SName
*
pName
,
TAOS_MULTI_BIND
*
bind
,
char
*
msgBuf
,
int32_t
msgBufLen
);
void
destroyBoundColumnInfo
(
void
*
pBoundInfo
);
int32_t
qCreateSName
(
SName
*
pName
,
const
char
*
pTableName
,
int32_t
acctId
,
char
*
dbName
,
char
*
msgBuf
,
int32_t
msgBufLen
);
#ifdef __cplusplus
}
...
...
source/libs/function/src/builtins.c
浏览文件 @
0035bb11
...
...
@@ -913,7 +913,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
{
.
name
=
"tbname"
,
.
type
=
FUNCTION_TYPE_TBNAME
,
.
classification
=
FUNC_MGT_PSEUDO_COLUMN_FUNC
,
.
classification
=
FUNC_MGT_PSEUDO_COLUMN_FUNC
|
FUNC_MGT_SCAN_PC_FUNC
,
.
translateFunc
=
translateTbnameColumn
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
...
...
source/libs/parser/test/mockCatalog.cpp
浏览文件 @
0035bb11
...
...
@@ -100,6 +100,17 @@ void generateInformationSchema(MockCatalogService* mcs) {
}
}
/*
* Table:t1
* Field | Type | DataType | Bytes |
* ==========================================================================
* ts | column | TIMESTAMP | 8 |
* c1 | column | INT | 4 |
* c2 | column | VARCHAR | 20 |
* c3 | column | BIGINT | 8 |
* c4 | column | DOUBLE | 8 |
* c5 | column | DOUBLE | 8 |
*/
void
generateTestT1
(
MockCatalogService
*
mcs
)
{
ITableBuilder
&
builder
=
mcs
->
createTableBuilder
(
"test"
,
"t1"
,
TSDB_NORMAL_TABLE
,
6
)
.
setPrecision
(
TSDB_TIME_PRECISION_MILLI
)
...
...
@@ -113,6 +124,17 @@ void generateTestT1(MockCatalogService* mcs) {
builder
.
done
();
}
/*
* Super Table: st1
* Field | Type | DataType | Bytes |
* ==========================================================================
* ts | column | TIMESTAMP | 8 |
* c1 | column | INT | 4 |
* c2 | column | VARCHAR | 20 |
* tag1 | tag | INT | 4 |
* tag2 | tag | VARCHAR | 20 |
* Child Table: st1s1, st1s2
*/
void
generateTestST1
(
MockCatalogService
*
mcs
)
{
ITableBuilder
&
builder
=
mcs
->
createTableBuilder
(
"test"
,
"st1"
,
TSDB_SUPER_TABLE
,
3
,
2
)
.
setPrecision
(
TSDB_TIME_PRECISION_MILLI
)
...
...
source/libs/planner/test/planSTableTest.cpp
浏览文件 @
0035bb11
...
...
@@ -23,4 +23,6 @@ TEST_F(PlanSuperTableTest, tbname) {
useDb
(
"root"
,
"test"
);
run
(
"select tbname from st1"
);
run
(
"select tbname, tag1, tag2 from st1"
);
}
source/libs/planner/test/planTestMain.cpp
浏览文件 @
0035bb11
...
...
@@ -36,11 +36,11 @@ class PlannerEnv : public testing::Environment {
static
void
parseArg
(
int
argc
,
char
*
argv
[])
{
int
opt
=
0
;
const
char
*
optstring
=
""
;
static
struct
option
long_options
[]
=
{{
"dump"
,
no
_argument
,
NULL
,
'd'
},
{
0
,
0
,
0
,
0
}};
static
struct
option
long_options
[]
=
{{
"dump"
,
optional
_argument
,
NULL
,
'd'
},
{
0
,
0
,
0
,
0
}};
while
((
opt
=
getopt_long
(
argc
,
argv
,
optstring
,
long_options
,
NULL
))
!=
-
1
)
{
switch
(
opt
)
{
case
'd'
:
g_isDump
=
true
;
setDumpModule
(
optarg
)
;
break
;
default:
break
;
...
...
source/libs/planner/test/planTestUtil.cpp
浏览文件 @
0035bb11
...
...
@@ -34,7 +34,41 @@ using namespace testing;
} \
} while (0);
bool
g_isDump
=
false
;
enum
DumpModule
{
DUMP_MODULE_NOTHING
=
1
,
DUMP_MODULE_PARSER
,
DUMP_MODULE_LOGIC
,
DUMP_MODULE_OPTIMIZED
,
DUMP_MODULE_SPLIT
,
DUMP_MODULE_SCALED
,
DUMP_MODULE_PHYSICAL
,
DUMP_MODULE_SUBPLAN
,
DUMP_MODULE_ALL
};
DumpModule
g_dumpModule
=
DUMP_MODULE_NOTHING
;
void
setDumpModule
(
const
char
*
pModule
)
{
if
(
NULL
==
pModule
)
{
g_dumpModule
=
DUMP_MODULE_ALL
;
}
else
if
(
0
==
strncasecmp
(
pModule
,
"parser"
,
strlen
(
pModule
)))
{
g_dumpModule
=
DUMP_MODULE_PARSER
;
}
else
if
(
0
==
strncasecmp
(
pModule
,
"logic"
,
strlen
(
pModule
)))
{
g_dumpModule
=
DUMP_MODULE_LOGIC
;
}
else
if
(
0
==
strncasecmp
(
pModule
,
"optimized"
,
strlen
(
pModule
)))
{
g_dumpModule
=
DUMP_MODULE_OPTIMIZED
;
}
else
if
(
0
==
strncasecmp
(
pModule
,
"split"
,
strlen
(
pModule
)))
{
g_dumpModule
=
DUMP_MODULE_SPLIT
;
}
else
if
(
0
==
strncasecmp
(
pModule
,
"scaled"
,
strlen
(
pModule
)))
{
g_dumpModule
=
DUMP_MODULE_SCALED
;
}
else
if
(
0
==
strncasecmp
(
pModule
,
"physical"
,
strlen
(
pModule
)))
{
g_dumpModule
=
DUMP_MODULE_PHYSICAL
;
}
else
if
(
0
==
strncasecmp
(
pModule
,
"subplan"
,
strlen
(
pModule
)))
{
g_dumpModule
=
DUMP_MODULE_SUBPLAN
;
}
else
if
(
0
==
strncasecmp
(
pModule
,
"all"
,
strlen
(
pModule
)))
{
g_dumpModule
=
DUMP_MODULE_PHYSICAL
;
}
}
class
PlannerTestBaseImpl
{
public:
...
...
@@ -66,11 +100,9 @@ class PlannerTestBaseImpl {
SQueryPlan
*
pPlan
=
nullptr
;
doCreatePhysiPlan
(
&
cxt
,
pLogicPlan
,
&
pPlan
);
if
(
g_isDump
)
{
dump
();
}
dump
(
g_dumpModule
);
}
catch
(...)
{
dump
();
dump
(
DUMP_MODULE_ALL
);
throw
;
}
}
...
...
@@ -109,23 +141,48 @@ class PlannerTestBaseImpl {
res_
.
physiSubplans_
.
clear
();
}
void
dump
()
{
void
dump
(
DumpModule
module
)
{
if
(
DUMP_MODULE_NOTHING
==
module
)
{
return
;
}
cout
<<
"==========================================sql : ["
<<
stmtEnv_
.
sql_
<<
"]"
<<
endl
;
cout
<<
"syntax tree : "
<<
endl
;
cout
<<
res_
.
ast_
<<
endl
;
cout
<<
"raw logic plan : "
<<
endl
;
cout
<<
res_
.
rawLogicPlan_
<<
endl
;
cout
<<
"optimized logic plan : "
<<
endl
;
cout
<<
res_
.
optimizedLogicPlan_
<<
endl
;
cout
<<
"split logic plan : "
<<
endl
;
cout
<<
res_
.
splitLogicPlan_
<<
endl
;
cout
<<
"scaled logic plan : "
<<
endl
;
cout
<<
res_
.
scaledLogicPlan_
<<
endl
;
cout
<<
"physical plan : "
<<
endl
;
cout
<<
res_
.
physiPlan_
<<
endl
;
cout
<<
"physical subplan : "
<<
endl
;
for
(
const
auto
&
subplan
:
res_
.
physiSubplans_
)
{
cout
<<
subplan
<<
endl
;
if
(
DUMP_MODULE_ALL
==
module
||
DUMP_MODULE_PARSER
==
module
)
{
cout
<<
"syntax tree : "
<<
endl
;
cout
<<
res_
.
ast_
<<
endl
;
}
if
(
DUMP_MODULE_ALL
==
module
||
DUMP_MODULE_LOGIC
==
module
)
{
cout
<<
"raw logic plan : "
<<
endl
;
cout
<<
res_
.
rawLogicPlan_
<<
endl
;
}
if
(
DUMP_MODULE_ALL
==
module
||
DUMP_MODULE_OPTIMIZED
==
module
)
{
cout
<<
"optimized logic plan : "
<<
endl
;
cout
<<
res_
.
optimizedLogicPlan_
<<
endl
;
}
if
(
DUMP_MODULE_ALL
==
module
||
DUMP_MODULE_SPLIT
==
module
)
{
cout
<<
"split logic plan : "
<<
endl
;
cout
<<
res_
.
splitLogicPlan_
<<
endl
;
}
if
(
DUMP_MODULE_ALL
==
module
||
DUMP_MODULE_SCALED
==
module
)
{
cout
<<
"scaled logic plan : "
<<
endl
;
cout
<<
res_
.
scaledLogicPlan_
<<
endl
;
}
if
(
DUMP_MODULE_ALL
==
module
||
DUMP_MODULE_PHYSICAL
==
module
)
{
cout
<<
"physical plan : "
<<
endl
;
cout
<<
res_
.
physiPlan_
<<
endl
;
}
if
(
DUMP_MODULE_ALL
==
module
||
DUMP_MODULE_SUBPLAN
==
module
)
{
cout
<<
"physical subplan : "
<<
endl
;
for
(
const
auto
&
subplan
:
res_
.
physiSubplans_
)
{
cout
<<
subplan
<<
endl
;
}
}
}
...
...
source/libs/planner/test/planTestUtil.h
浏览文件 @
0035bb11
...
...
@@ -32,6 +32,6 @@ class PlannerTestBase : public testing::Test {
std
::
unique_ptr
<
PlannerTestBaseImpl
>
impl_
;
};
extern
bool
g_isDump
;
extern
void
setDumpModule
(
const
char
*
pModule
)
;
#endif // PLAN_TEST_UTIL_H
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录