@@ -8,6 +8,7 @@ package sql_test
88import (
99 "bytes"
1010 "context"
11+ "fmt"
1112 "regexp"
1213 "testing"
1314
@@ -18,8 +19,10 @@ import (
1819 "github.com/cockroachdb/cockroach/pkg/sql/catalog/lease"
1920 "github.com/cockroachdb/cockroach/pkg/testutils"
2021 "github.com/cockroachdb/cockroach/pkg/testutils/serverutils"
22+ "github.com/cockroachdb/cockroach/pkg/testutils/sqlutils"
2123 "github.com/cockroachdb/cockroach/pkg/util/leaktest"
2224 "github.com/cockroachdb/cockroach/pkg/util/log"
25+ "github.com/cockroachdb/cockroach/pkg/util/metamorphic"
2326 "github.com/cockroachdb/cockroach/pkg/util/metric"
2427 "github.com/stretchr/testify/require"
2528)
@@ -205,6 +208,66 @@ func TestQueryCounts(t *testing.T) {
205208 }
206209}
207210
211+ func TestStatementMetrics (t * testing.T ) {
212+ defer leaktest .AfterTest (t )()
213+ defer log .Scope (t ).Close (t )
214+
215+ params , _ := createTestServerParamsAllowTenants ()
216+ srv , sqlDB , _ := serverutils .StartServer (t , params )
217+ defer srv .Stopper ().Stop (context .Background ())
218+ runner := sqlutils .MakeSQLRunner (sqlDB )
219+ s := srv .ApplicationLayer ()
220+
221+ runner .Exec (t , `CREATE DATABASE db` )
222+ runner .Exec (t , `CREATE TABLE db.t (x INT PRIMARY KEY, y INT, a STRING[], v VECTOR(2))` )
223+ runner .Exec (t , `CREATE INDEX ON db.t (y)` )
224+ runner .Exec (t , `CREATE INVERTED INDEX ON db.t (a)` )
225+ runner .Exec (t , `CREATE VECTOR INDEX ON db.t (v)` )
226+ runner .Exec (t , `INSERT INTO db.t VALUES (1, 10, ARRAY['apple', 'orange'], '[1, 2]')` )
227+ runner .Exec (t , `INSERT INTO db.t VALUES (2, 20, ARRAY['banana'], '[3, 4]')` )
228+ runner .Exec (t , `INSERT INTO db.t VALUES (3, 30, ARRAY['apple', 'pear', 'mango'], '[5, 6]')` )
229+
230+ testCases := []struct {
231+ query string
232+ rowsRead int64
233+ // If true, then skip metamorphic testing for this query.
234+ skipMetamorphic bool
235+ }{
236+ {query : `SELECT * FROM db.t WHERE x = 1` , rowsRead : 1 },
237+ {query : `SELECT * FROM db.t WHERE x <= 2` , rowsRead : 2 },
238+ {query : `SELECT * FROM db.t WHERE a @> ARRAY['apple']` , rowsRead : 4 },
239+ {
240+ query : `SELECT * FROM db.t@t_a_idx t1, db.t t2 WHERE t1.a @> t2.a` ,
241+ rowsRead : 12 ,
242+ // Skip this variation under metamorphic testing because the inverted
243+ // joiner batch size can affect number of rows read.
244+ skipMetamorphic : true ,
245+ },
246+ {query : `SELECT * FROM db.t ORDER BY v <-> '[2, 2]' LIMIT 1` , rowsRead : 3 },
247+ }
248+
249+ lastRowsRead := s .MustGetSQLCounter (sql .MetaStatementRowsRead .Name )
250+
251+ for _ , tc := range testCases {
252+ t .Run (tc .query , func (t * testing.T ) {
253+ for _ , vectorized := range []string {"off" , "on" } {
254+ runner .Exec (t , "SET vectorize = $1" , vectorized )
255+ t .Run (fmt .Sprintf ("vectorize = %s" , vectorized ), func (t * testing.T ) {
256+ if tc .skipMetamorphic && metamorphic .IsMetamorphicBuild () {
257+ return
258+ }
259+
260+ runner .Exec (t , tc .query )
261+ actual , err := checkCounterDelta (
262+ s , sql .MetaStatementRowsRead , lastRowsRead , tc .rowsRead )
263+ require .NoError (t , err )
264+ lastRowsRead = actual
265+ })
266+ }
267+ })
268+ }
269+ }
270+
208271func TestAbortCountConflictingWrites (t * testing.T ) {
209272 defer leaktest .AfterTest (t )()
210273 defer log .Scope (t ).Close (t )
0 commit comments