TD-12450 ut of combination of insert parser and insert planner
This commit is contained in:
parent
1ce9487ff1
commit
53928fffd9
|
@ -35,7 +35,6 @@ typedef struct SParseContext {
|
||||||
void *pRpc;
|
void *pRpc;
|
||||||
struct SCatalog *pCatalog;
|
struct SCatalog *pCatalog;
|
||||||
const SEpSet *pEpSet;
|
const SEpSet *pEpSet;
|
||||||
int64_t id; // query id, generated by uuid generator
|
|
||||||
int8_t schemaAttached; // denote if submit block is built with table schema or not
|
int8_t schemaAttached; // denote if submit block is built with table schema or not
|
||||||
const char *pSql; // sql string
|
const char *pSql; // sql string
|
||||||
size_t sqlLen; // length of the sql string
|
size_t sqlLen; // length of the sql string
|
||||||
|
|
|
@ -909,6 +909,7 @@ int32_t parseInsertSql(SParseContext* pContext, SInsertStmtInfo** pInfo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
*pInfo = context.pOutput;
|
*pInfo = context.pOutput;
|
||||||
|
context.pOutput->nodeType = TSDB_SQL_INSERT;
|
||||||
context.pOutput->schemaAttache = pContext->schemaAttached;
|
context.pOutput->schemaAttache = pContext->schemaAttached;
|
||||||
context.pOutput->payloadType = PAYLOAD_TYPE_KV;
|
context.pOutput->payloadType = PAYLOAD_TYPE_KV;
|
||||||
|
|
||||||
|
|
|
@ -23,20 +23,20 @@
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
void generateTestT1(MockCatalogService* mcs) {
|
void generateTestT1(MockCatalogService* mcs) {
|
||||||
ITableBuilder& builder = mcs->createTableBuilder("root.test", "t1", TSDB_NORMAL_TABLE, 3)
|
ITableBuilder& builder = mcs->createTableBuilder("test", "t1", TSDB_NORMAL_TABLE, 3)
|
||||||
.setPrecision(TSDB_TIME_PRECISION_MILLI).setVgid(1).addColumn("ts", TSDB_DATA_TYPE_TIMESTAMP)
|
.setPrecision(TSDB_TIME_PRECISION_MILLI).setVgid(1).addColumn("ts", TSDB_DATA_TYPE_TIMESTAMP)
|
||||||
.addColumn("c1", TSDB_DATA_TYPE_INT).addColumn("c2", TSDB_DATA_TYPE_BINARY, 20);
|
.addColumn("c1", TSDB_DATA_TYPE_INT).addColumn("c2", TSDB_DATA_TYPE_BINARY, 20);
|
||||||
builder.done();
|
builder.done();
|
||||||
}
|
}
|
||||||
|
|
||||||
void generateTestST1(MockCatalogService* mcs) {
|
void generateTestST1(MockCatalogService* mcs) {
|
||||||
ITableBuilder& builder = mcs->createTableBuilder("root.test", "st1", TSDB_SUPER_TABLE, 3, 2)
|
ITableBuilder& builder = mcs->createTableBuilder("test", "st1", TSDB_SUPER_TABLE, 3, 2)
|
||||||
.setPrecision(TSDB_TIME_PRECISION_MILLI).addColumn("ts", TSDB_DATA_TYPE_TIMESTAMP)
|
.setPrecision(TSDB_TIME_PRECISION_MILLI).addColumn("ts", TSDB_DATA_TYPE_TIMESTAMP)
|
||||||
.addTag("tag1", TSDB_DATA_TYPE_INT).addTag("tag2", TSDB_DATA_TYPE_BINARY, 20)
|
.addTag("tag1", TSDB_DATA_TYPE_INT).addTag("tag2", TSDB_DATA_TYPE_BINARY, 20)
|
||||||
.addColumn("c1", TSDB_DATA_TYPE_INT).addColumn("c2", TSDB_DATA_TYPE_BINARY, 20);
|
.addColumn("c1", TSDB_DATA_TYPE_INT).addColumn("c2", TSDB_DATA_TYPE_BINARY, 20);
|
||||||
builder.done();
|
builder.done();
|
||||||
mcs->createSubTable("root.test", "st1", "st1s1", 1);
|
mcs->createSubTable("test", "st1", "st1s1", 1);
|
||||||
mcs->createSubTable("root.test", "st1", "st1s2", 2);
|
mcs->createSubTable("test", "st1", "st1s2", 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,9 +94,9 @@ public:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t catalogGetTableMeta(const char* pDBName, const char* pTableName, STableMeta** pTableMeta) const {
|
int32_t catalogGetTableMeta(const char* pDbFullName, const char* pTableName, STableMeta** pTableMeta) const {
|
||||||
std::unique_ptr<STableMeta> table;
|
std::unique_ptr<STableMeta> table;
|
||||||
int32_t code = copyTableSchemaMeta(pDBName, pTableName, &table);
|
int32_t code = copyTableSchemaMeta(toDbname(pDbFullName), pTableName, &table);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ public:
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t catalogGetTableHashVgroup(const char* pDBName, const char* pTableName, SVgroupInfo* vgInfo) const {
|
int32_t catalogGetTableHashVgroup(const char* pDbFullName, const char* pTableName, SVgroupInfo* vgInfo) const {
|
||||||
// todo
|
// todo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -195,6 +195,14 @@ private:
|
||||||
typedef std::map<std::string, std::shared_ptr<MockTableMeta>> TableMetaCache;
|
typedef std::map<std::string, std::shared_ptr<MockTableMeta>> TableMetaCache;
|
||||||
typedef std::map<std::string, TableMetaCache> DbMetaCache;
|
typedef std::map<std::string, TableMetaCache> DbMetaCache;
|
||||||
|
|
||||||
|
std::string toDbname(const std::string& dbFullName) const {
|
||||||
|
std::string::size_type n = dbFullName.find(".");
|
||||||
|
if (n == std::string::npos) {
|
||||||
|
return dbFullName;
|
||||||
|
}
|
||||||
|
return dbFullName.substr(n + 1);
|
||||||
|
}
|
||||||
|
|
||||||
std::string ttToString(int8_t tableType) const {
|
std::string ttToString(int8_t tableType) const {
|
||||||
switch (tableType) {
|
switch (tableType) {
|
||||||
case TSDB_SUPER_TABLE:
|
case TSDB_SUPER_TABLE:
|
||||||
|
|
|
@ -33,10 +33,6 @@ protected:
|
||||||
void pushScan(const string& db, const string& table, int32_t scanOp) {
|
void pushScan(const string& db, const string& table, int32_t scanOp) {
|
||||||
shared_ptr<MockTableMeta> meta = mockCatalogService->getTableMeta(db, table);
|
shared_ptr<MockTableMeta> meta = mockCatalogService->getTableMeta(db, table);
|
||||||
EXPECT_TRUE(meta);
|
EXPECT_TRUE(meta);
|
||||||
// typedef struct SQueryPlanNode {
|
|
||||||
// SArray *pExpr; // the query functions or sql aggregations
|
|
||||||
// int32_t numOfExpr; // number of result columns, which is also the number of pExprs
|
|
||||||
// } SQueryPlanNode;
|
|
||||||
unique_ptr<SQueryPlanNode> scan((SQueryPlanNode*)calloc(1, sizeof(SQueryPlanNode)));
|
unique_ptr<SQueryPlanNode> scan((SQueryPlanNode*)calloc(1, sizeof(SQueryPlanNode)));
|
||||||
scan->info.type = scanOp;
|
scan->info.type = scanOp;
|
||||||
scan->numOfCols = meta->schema->tableInfo.numOfColumns;
|
scan->numOfCols = meta->schema->tableInfo.numOfColumns;
|
||||||
|
@ -54,6 +50,27 @@ protected:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t run(const string& db, const string& sql) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
SParseContext cxt;
|
||||||
|
buildParseContext(db, sql, &cxt);
|
||||||
|
SQueryNode* query;
|
||||||
|
if (qIsInsertSql(cxt.pSql, cxt.sqlLen)) {
|
||||||
|
code = qParseInsertSql(&cxt, (SInsertStmtInfo**)&query);
|
||||||
|
} else {
|
||||||
|
// todo
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
cout << "error no:" << code << ", msg:" << cxt.pMsg << endl;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
SQueryDag* dag = nullptr;
|
||||||
|
code = qCreateQueryDag(query, nullptr, &dag);
|
||||||
|
dag_.reset(dag);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
void explain() {
|
void explain() {
|
||||||
size_t level = taosArrayGetSize(dag_->pSubplans);
|
size_t level = taosArrayGetSize(dag_->pSubplans);
|
||||||
for (size_t i = 0; i < level; ++i) {
|
for (size_t i = 0; i < level; ++i) {
|
||||||
|
@ -64,7 +81,8 @@ protected:
|
||||||
std::cout << "no " << j << ":" << std::endl;
|
std::cout << "no " << j << ":" << std::endl;
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
char* str = nullptr;
|
char* str = nullptr;
|
||||||
ASSERT_EQ (TSDB_CODE_SUCCESS, qSubPlanToString((const SSubplan*)taosArrayGetP(subplans, j), &str, &len));
|
ASSERT_EQ(TSDB_CODE_SUCCESS, qSubPlanToString((const SSubplan*)taosArrayGetP(subplans, j), &str, &len));
|
||||||
|
std::cout << "len:" << len << std::endl;
|
||||||
std::cout << str << std::endl;
|
std::cout << str << std::endl;
|
||||||
free(str);
|
free(str);
|
||||||
}
|
}
|
||||||
|
@ -108,6 +126,25 @@ private:
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void buildParseContext(const string& db, const string& sql, SParseContext* pCxt) {
|
||||||
|
static string _db;
|
||||||
|
static string _sql;
|
||||||
|
static const int32_t _msgMaxLen = 4096;
|
||||||
|
static char _msg[_msgMaxLen];
|
||||||
|
|
||||||
|
_db = db;
|
||||||
|
_sql = sql;
|
||||||
|
memset(_msg, 0, _msgMaxLen);
|
||||||
|
|
||||||
|
pCxt->ctx.acctId = 1;
|
||||||
|
pCxt->ctx.db = _db.c_str();
|
||||||
|
pCxt->ctx.requestId = 1;
|
||||||
|
pCxt->pSql = _sql.c_str();
|
||||||
|
pCxt->sqlLen = _sql.length();
|
||||||
|
pCxt->pMsg = _msg;
|
||||||
|
pCxt->msgLen = _msgMaxLen;
|
||||||
|
}
|
||||||
|
|
||||||
shared_ptr<MockTableMeta> meta_;
|
shared_ptr<MockTableMeta> meta_;
|
||||||
unique_ptr<SQueryPlanNode> logicPlan_;
|
unique_ptr<SQueryPlanNode> logicPlan_;
|
||||||
unique_ptr<SQueryDag> dag_;
|
unique_ptr<SQueryDag> dag_;
|
||||||
|
@ -115,7 +152,7 @@ private:
|
||||||
|
|
||||||
// select * from table
|
// select * from table
|
||||||
TEST_F(PhyPlanTest, tableScanTest) {
|
TEST_F(PhyPlanTest, tableScanTest) {
|
||||||
pushScan("root.test", "t1", QNODE_TABLESCAN);
|
pushScan("test", "t1", QNODE_TABLESCAN);
|
||||||
ASSERT_EQ(run(), TSDB_CODE_SUCCESS);
|
ASSERT_EQ(run(), TSDB_CODE_SUCCESS);
|
||||||
explain();
|
explain();
|
||||||
SQueryDag* dag = reslut();
|
SQueryDag* dag = reslut();
|
||||||
|
@ -124,9 +161,17 @@ TEST_F(PhyPlanTest, tableScanTest) {
|
||||||
|
|
||||||
// select * from supertable
|
// select * from supertable
|
||||||
TEST_F(PhyPlanTest, superTableScanTest) {
|
TEST_F(PhyPlanTest, superTableScanTest) {
|
||||||
pushScan("root.test", "st1", QNODE_TABLESCAN);
|
pushScan("test", "st1", QNODE_TABLESCAN);
|
||||||
ASSERT_EQ(run(), TSDB_CODE_SUCCESS);
|
ASSERT_EQ(run(), TSDB_CODE_SUCCESS);
|
||||||
explain();
|
explain();
|
||||||
SQueryDag* dag = reslut();
|
SQueryDag* dag = reslut();
|
||||||
// todo check
|
// todo check
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// insert into t values(...)
|
||||||
|
TEST_F(PhyPlanTest, insertTest) {
|
||||||
|
ASSERT_EQ(run("test", "insert into t1 values (now, 1, \"beijing\")"), TSDB_CODE_SUCCESS);
|
||||||
|
explain();
|
||||||
|
SQueryDag* dag = reslut();
|
||||||
|
// todo check
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue