@@ -50,6 +50,9 @@ class ClickHouse extends SQL
5050
5151 private Client $ client ;
5252
53+ /** @var bool Whether to use FINAL in SELECT queries to force merge-on-read (tests) */
54+ private bool $ useFinal = true ;
55+
5356 protected ?int $ tenant = null ;
5457
5558 protected bool $ sharedTables = false ;
@@ -86,6 +89,15 @@ public function __construct(
8689 $ this ->client ->setTimeout (30_000 ); // 30 seconds
8790 }
8891
92+ /**
93+ * Enable or disable using FINAL in SELECT queries.
94+ */
95+ public function setUseFinal (bool $ useFinal ): self
96+ {
97+ $ this ->useFinal = $ useFinal ;
98+ return $ this ;
99+ }
100+
89101 /**
90102 * Get adapter name.
91103 */
@@ -846,6 +858,7 @@ public function find(array $queries = []): array
846858 {
847859 $ tableName = $ this ->getTableName ();
848860 $ escapedTable = $ this ->escapeIdentifier ($ this ->database ) . '. ' . $ this ->escapeIdentifier ($ tableName );
861+ $ fromTable = $ escapedTable . ($ this ->useFinal ? ' FINAL ' : '' );
849862
850863 // Parse queries
851864 $ parsed = $ this ->parseQueries ($ queries );
@@ -875,7 +888,7 @@ public function find(array $queries = []): array
875888 $ offsetClause = isset ($ parsed ['offset ' ]) ? ' OFFSET {offset:UInt64} ' : '' ;
876889 $ sql = "
877890 SELECT {$ selectColumns }
878- FROM {$ escapedTable }{$ whereClause }{$ orderClause }{$ limitClause }{$ offsetClause }
891+ FROM {$ fromTable }{$ whereClause }{$ orderClause }{$ limitClause }{$ offsetClause }
879892 FORMAT TabSeparated
880893 " ;
881894
@@ -894,6 +907,7 @@ public function count(array $queries = []): int
894907 {
895908 $ tableName = $ this ->getTableName ();
896909 $ escapedTable = $ this ->escapeIdentifier ($ this ->database ) . '. ' . $ this ->escapeIdentifier ($ tableName );
910+ $ fromTable = $ escapedTable . ($ this ->useFinal ? ' FINAL ' : '' );
897911
898912 // Parse queries - we only need filters and params
899913 $ parsed = $ this ->parseQueries ($ queries );
@@ -915,7 +929,7 @@ public function count(array $queries = []): int
915929
916930 $ sql = "
917931 SELECT COUNT(*) as count
918- FROM {$ escapedTable }{$ whereClause }
932+ FROM {$ fromTable }{$ whereClause }
919933 FORMAT TabSeparated
920934 " ;
921935
@@ -1316,6 +1330,7 @@ public function sumByPeriod(string $metric, string $period, array $queries = [])
13161330 {
13171331 $ tableName = $ this ->getTableName ();
13181332 $ escapedTable = $ this ->escapeIdentifier ($ this ->database ) . '. ' . $ this ->escapeIdentifier ($ tableName );
1333+ $ fromTable = $ escapedTable . ($ this ->useFinal ? ' FINAL ' : '' );
13191334
13201335 // Build query constraints
13211336 $ allQueries = [
@@ -1344,7 +1359,7 @@ public function sumByPeriod(string $metric, string $period, array $queries = [])
13441359
13451360 $ sql = "
13461361 SELECT sum(value) as total
1347- FROM {$ escapedTable }{$ whereClause }
1362+ FROM {$ fromTable }{$ whereClause }
13481363 FORMAT TabSeparated
13491364 " ;
13501365
0 commit comments