Merge pull request #24336 from taosdata/FIX/TD-28125
Fix: not use last row scan when select tbname and last
This commit is contained in:
commit
ad83e6439f
|
@ -2529,7 +2529,7 @@ static bool lastRowScanOptCheckFuncList(SLogicNode* pNode, bool* hasOtherFunc) {
|
|||
SNode* pParam = nodesListGetNode(pAggFunc->pParameterList, 0);
|
||||
if (QUERY_NODE_COLUMN == nodeType(pParam)) {
|
||||
SColumnNode* pCol = (SColumnNode*)pParam;
|
||||
if (PRIMARYKEY_TIMESTAMP_COL_ID != pCol->colId) {
|
||||
if (COLUMN_TYPE_COLUMN == pCol->colType && PRIMARYKEY_TIMESTAMP_COL_ID != pCol->colId) {
|
||||
if (selectNonPKColId != pCol->colId) {
|
||||
selectNonPKColId = pCol->colId;
|
||||
selectNonPKColNum++;
|
||||
|
|
|
@ -289,6 +289,82 @@ class TDTestCase:
|
|||
tdSql.query(f"select * from {stbname}")
|
||||
tdSql.checkRows(tables * rows)
|
||||
|
||||
def check_explain_res_has_row(self, plan_str_expect: str, rows, sql):
|
||||
plan_found = False
|
||||
for row in rows:
|
||||
if str(row).find(plan_str_expect) >= 0:
|
||||
tdLog.debug("plan: [%s] found in: [%s]" % (plan_str_expect, str(row)))
|
||||
plan_found = True
|
||||
break
|
||||
if not plan_found:
|
||||
tdLog.exit("plan: %s not found in res: [%s] in sql: %s" % (plan_str_expect, str(rows), sql))
|
||||
|
||||
def check_explain_res_no_row(self, plan_str_not_expect: str, res, sql):
|
||||
for row in res:
|
||||
if str(row).find(plan_str_not_expect) >= 0:
|
||||
tdLog.exit('plan: [%s] found in: [%s] for sql: %s' % (plan_str_not_expect, str(row), sql))
|
||||
|
||||
def explain_sql(self, sql: str):
|
||||
sql = "explain " + sql
|
||||
tdSql.query(sql, queryTimes=1)
|
||||
return tdSql.queryResult
|
||||
|
||||
def last_check_scan_type(self, cacheModel):
|
||||
tdSql.execute("create database test_last_tbname cachemodel '%s';" % cacheModel)
|
||||
tdSql.execute("use test_last_tbname;")
|
||||
tdSql.execute("create stable test_last_tbname.st(ts timestamp, id int) tags(tid int);")
|
||||
tdSql.execute("create table test_last_tbname.test_t1 using test_last_tbname.st tags(1);")
|
||||
|
||||
maxRange = 100
|
||||
# 2023-11-13 00:00:00.000
|
||||
startTs = 1699804800000
|
||||
for i in range(maxRange):
|
||||
insertSqlString = "insert into test_last_tbname.test_t1 values(%d, %d);" % (startTs + i, i)
|
||||
tdSql.execute(insertSqlString)
|
||||
|
||||
last_ts = startTs + maxRange
|
||||
tdSql.execute("insert into test_last_tbname.test_t1 (ts) values(%d)" % (last_ts))
|
||||
sql = f'select tbname, last(ts) from test_last_tbname.test_t1;'
|
||||
tdSql.query(sql)
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, "test_t1")
|
||||
tdSql.checkData(0, 1, last_ts)
|
||||
|
||||
explain_res = self.explain_sql(sql)
|
||||
if cacheModel == "both" or cacheModel == "last_value":
|
||||
self.check_explain_res_has_row("Last Row Scan", explain_res, sql)
|
||||
else:
|
||||
self.check_explain_res_has_row("Table Scan", explain_res, sql)
|
||||
|
||||
|
||||
sql = f'select last(ts), tbname from test_last_tbname.test_t1;'
|
||||
tdSql.query(sql)
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, last_ts)
|
||||
tdSql.checkData(0, 1, "test_t1")
|
||||
|
||||
explain_res = self.explain_sql(sql)
|
||||
if cacheModel == "both" or cacheModel == "last_value":
|
||||
self.check_explain_res_has_row("Last Row Scan", explain_res, sql)
|
||||
else:
|
||||
self.check_explain_res_has_row("Table Scan", explain_res, sql)
|
||||
|
||||
sql = f'select tbname, last(ts), tbname from test_last_tbname.test_t1;'
|
||||
tdSql.query(sql)
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, "test_t1")
|
||||
tdSql.checkData(0, 1, last_ts)
|
||||
tdSql.checkData(0, 2, "test_t1")
|
||||
|
||||
explain_res = self.explain_sql(sql)
|
||||
if cacheModel == "both" or cacheModel == "last_value":
|
||||
self.check_explain_res_has_row("Last Row Scan", explain_res, sql)
|
||||
else:
|
||||
self.check_explain_res_has_row("Table Scan", explain_res, sql)
|
||||
|
||||
tdSql.execute("drop table if exists test_last_tbname.test_t1 ;")
|
||||
tdSql.execute("drop stable if exists test_last_tbname.st;")
|
||||
tdSql.execute("drop database if exists test_last_tbname;")
|
||||
|
||||
def run(self):
|
||||
self.last_check_stb_tb_base()
|
||||
|
@ -296,6 +372,11 @@ class TDTestCase:
|
|||
self.last_check_stb_distribute()
|
||||
self.last_file_check()
|
||||
|
||||
self.last_check_scan_type("none")
|
||||
self.last_check_scan_type("last_row")
|
||||
self.last_check_scan_type("last_value")
|
||||
self.last_check_scan_type("both")
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success("%s successfully executed" % __file__)
|
||||
|
|
|
@ -181,7 +181,7 @@ class TDTestCase:
|
|||
select_items = [
|
||||
"last(ts), ts", "last(ts), c1", "last(ts), c2", "last(ts), c3",\
|
||||
"last(ts), c4", "last(ts), tbname", "last(ts), t1", "last(ts), ts, ts"]
|
||||
has_last_row_scan_res = [1, 0, 0, 0, 0, 0, 0, 1]
|
||||
has_last_row_scan_res = [1, 0, 0, 0, 0, 1, 1, 1]
|
||||
res_expect = [
|
||||
["2018-11-25 19:30:00.000", "2018-11-25 19:30:00.000"],
|
||||
None, None, None, None, None, None,
|
||||
|
@ -193,7 +193,7 @@ class TDTestCase:
|
|||
|
||||
select_items = ["last(c1),ts", "last(c1), c1", "last(c1), c2", "last(c1), c3",\
|
||||
"last(c1), c4", "last(c1), tbname", "last(c1), t1", "last(c1), ts, ts", "last(c1), c1, c1"]
|
||||
has_last_row_scan_res = [1, 1, 0, 0, 0, 0, 0, 1, 1]
|
||||
has_last_row_scan_res = [1, 1, 0, 0, 0, 1, 1, 1, 1]
|
||||
res_expect = [
|
||||
[999, "2018-11-25 19:30:00.000"],
|
||||
[999, 999], None, None, None, None, None,
|
||||
|
@ -207,7 +207,7 @@ class TDTestCase:
|
|||
sql_template = 'select %s from t1'
|
||||
select_items = ["last(c4),ts", "last(c4), c1", "last(c4), c2", "last(c4), c3",\
|
||||
"last(c4), c4", "last(c4), tbname", "last(c4), t1"]
|
||||
has_last_row_scan_res = [1, 0, 0, 0, 1, 0, 0]
|
||||
has_last_row_scan_res = [1, 0, 0, 0, 1, 1, 1]
|
||||
res_expect = [
|
||||
[4999.000000000000000, "2018-11-25 19:30:00.000"],
|
||||
None,None,None,
|
||||
|
@ -220,7 +220,7 @@ class TDTestCase:
|
|||
sql_template = 'select %s from meters'
|
||||
select_items = ["last(c8), ts", "last(c8), c1", "last(c8), c8", "last(c8), tbname", \
|
||||
"last(c8), t1", "last(c8), c8, c8", "last(c8), ts, ts"]
|
||||
has_last_row_scan_res = [1, 0, 1, 0, 0, 1, 1]
|
||||
has_last_row_scan_res = [1, 0, 1, 1, 1, 1, 1]
|
||||
res_expect = [
|
||||
["binary9999", "2018-11-25 19:30:00.000"],
|
||||
None,
|
||||
|
|
Loading…
Reference in New Issue