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:
dapan1121 2024-01-09 08:40:15 +08:00 committed by GitHub
commit ad83e6439f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 86 additions and 5 deletions

View File

@ -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++;

View File

@ -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__)

View 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,