|
21 | 21 | use PhpMyAdmin\Utils\ForeignKey; |
22 | 22 |
|
23 | 23 | use function __; |
| 24 | +use function array_find_key; |
24 | 25 | use function array_key_exists; |
25 | 26 | use function array_keys; |
26 | 27 | use function array_map; |
| 28 | +use function assert; |
27 | 29 | use function bin2hex; |
28 | 30 | use function ceil; |
29 | 31 | use function count; |
|
34 | 36 | use function is_array; |
35 | 37 | use function is_bool; |
36 | 38 | use function is_object; |
| 39 | +use function is_string; |
37 | 40 | use function session_start; |
38 | 41 | use function session_write_close; |
39 | 42 | use function sprintf; |
40 | 43 | use function str_contains; |
41 | 44 | use function str_replace; |
| 45 | +use function strtoupper; |
42 | 46 | use function ucwords; |
43 | 47 |
|
44 | 48 | /** |
@@ -745,15 +749,30 @@ private function countQueryResults( |
745 | 749 | /** @var SelectStatement $statement */ |
746 | 750 | $statement = $analyzedSqlResults['statement']; |
747 | 751 |
|
| 752 | + assert($statement->options !== null); |
| 753 | + /** @var int|null $noCacheIndex */ |
| 754 | + $noCacheIndex = array_find_key( |
| 755 | + $statement->options->options, |
| 756 | + /** @param mixed $value */ |
| 757 | + static function ($value): bool { |
| 758 | + return is_string($value) && strtoupper($value) === 'SQL_NO_CACHE'; |
| 759 | + } |
| 760 | + ); |
748 | 761 | $changeOrder = $analyzedSqlResults['order'] !== false; |
749 | 762 | $changeLimit = $analyzedSqlResults['limit'] !== false; |
750 | 763 | $changeExpression = $analyzedSqlResults['is_group'] === false |
751 | 764 | && $analyzedSqlResults['distinct'] === false |
752 | 765 | && $analyzedSqlResults['union'] === false |
753 | 766 | && count($statement->expr) === 1; |
754 | 767 |
|
755 | | - if ($changeOrder || $changeLimit || $changeExpression) { |
| 768 | + if ($changeOrder || $changeLimit || $changeExpression || $noCacheIndex !== null) { |
756 | 769 | $statement = clone $statement; |
| 770 | + // Remove SQL_NO_CACHE from subquery because it is not valid sql |
| 771 | + if ($noCacheIndex !== null) { |
| 772 | + assert($statement->options !== null); |
| 773 | + $statement->options = clone $statement->options; |
| 774 | + unset($statement->options->options[$noCacheIndex]); |
| 775 | + } |
757 | 776 | } |
758 | 777 |
|
759 | 778 | // Remove ORDER BY to decrease unnecessary sorting time |
|
0 commit comments