From 74b0c7840905f3f131347b67d414667d571f90c6 Mon Sep 17 00:00:00 2001 From: Anway Durge Date: Thu, 1 Oct 2026 10:31:41 +0530 Subject: [PATCH] MDEV-41171 SQL_SELECT_LIMIT and FOUND_ROWS() on the I_S.TABLES fast path Set limit_found_rows from matching rows sent on the fast path so FOUND_ROWS() matches the fallback path when SQL_CALC_FOUND_ROWS is not used. --- mysql-test/main/mdev_31342.result | 22 +++++++++++++++++++ mysql-test/main/mdev_31342.test | 35 +++++++++++++++++++++++++++++++ sql/sql_show.cc | 2 ++ 3 files changed, 59 insertions(+) diff --git a/mysql-test/main/mdev_31342.result b/mysql-test/main/mdev_31342.result index d6c37d912b3..e59d1092309 100644 --- a/mysql-test/main/mdev_31342.result +++ b/mysql-test/main/mdev_31342.result @@ -841,3 +841,25 @@ LIMIT 1; TABLE_NAME tb3 DROP DATABASE mdev41167; +# +# MDEV-41171: @@sql_select_limit and FOUND_ROWS() on the fast path +# +CREATE DATABASE mdev41171; +CREATE TABLE mdev41171.t1(i INT); +CREATE TABLE mdev41171.t2(i INT); +CREATE TABLE mdev41171.t3(i INT); +SET @@session.sql_select_limit=2; +SELECT TABLE_CATALOG FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='mdev41171'; +SET @@session.sql_select_limit=DEFAULT; +SELECT 1; +1 +1 +SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='mdev41171'; +TABLE_NAME +t1 +t2 +t3 +SELECT FOUND_ROWS(); +FOUND_ROWS() +3 +DROP DATABASE mdev41171; diff --git a/mysql-test/main/mdev_31342.test b/mysql-test/main/mdev_31342.test index 86f626f9e5e..4d642b6dff9 100644 --- a/mysql-test/main/mdev_31342.test +++ b/mysql-test/main/mdev_31342.test @@ -323,3 +323,38 @@ SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='mdev41167' AND (TABLE_NAME='tb3' OR TABLE_CATALOG='nope') LIMIT 1; DROP DATABASE mdev41167; + +--echo # +--echo # MDEV-41171: @@sql_select_limit and FOUND_ROWS() on the fast path +--echo # +CREATE DATABASE mdev41171; +CREATE TABLE mdev41171.t1(i INT); +CREATE TABLE mdev41171.t2(i INT); +CREATE TABLE mdev41171.t3(i INT); +SET @@session.sql_select_limit=2; +# CALL (used by --sp-protocol) sets sql_select_limit=HA_POS_ERROR, so +# do not compare the row list. Capture FOUND_ROWS() immediately. +--disable_result_log +SELECT TABLE_CATALOG FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='mdev41171'; +--enable_result_log +--disable_query_log +--disable_result_log +let $n= query_get_value(SELECT FOUND_ROWS(), FOUND_ROWS(), 1); +--enable_result_log +--enable_query_log +if (`SELECT $SP_PROTOCOL = 0`) +{ + if ($n != 2) + { + --echo # sql_select_limit=2 returned $n rows + --die + } +} +SET @@session.sql_select_limit=DEFAULT; +SELECT 1; +--sorted_result +SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='mdev41171'; +--disable_ps_protocol +SELECT FOUND_ROWS(); +--enable_ps_protocol +DROP DATABASE mdev41171; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index a7ae9626aa3..e4b07b942f9 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -10295,6 +10295,8 @@ bool get_schema_tables_result(JOIN *join, } plan->fp_state= IS_table_read_plan::FP_STREAMING; } + /* FOUND_ROWS() without SQL_CALC_FOUND_ROWS is rows sent. */ + thd->limit_found_rows= plan->sent_rows; my_eof(thd); result= 1; }