From 87c0615ae88e8d9c0f34a9b1a06857576ac41b35 Mon Sep 17 00:00:00 2001
From: Rebecca Taft <becca@cockroachlabs.com>
Date: Wed, 29 Jan 2025 12:56:34 -0600
Subject: [PATCH] sqlsmith: randomly generate auto partial stats in sqlsmith
 tests

Epic: None

Release note: None
---
 pkg/internal/sqlsmith/relational.go | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/pkg/internal/sqlsmith/relational.go b/pkg/internal/sqlsmith/relational.go
index c7f97a6c654e..4df1e4d7e9f8 100644
--- a/pkg/internal/sqlsmith/relational.go
+++ b/pkg/internal/sqlsmith/relational.go
@@ -1865,21 +1865,24 @@ func makeCreateStats(s *Smither) (tree.Statement, bool) {
 
 	// Names slightly change behavior of statistics, so pick randomly between:
 	// ~50%: __auto__ (simulating auto stats)
-	// ~33%: random (simulating manual CREATE STATISTICS statements)
+	// ~17%: __auto_partial__ (simulating auto partial stats)
+	// ~17%: random (simulating manual CREATE STATISTICS statements)
 	// ~17%: blank (simulating manual ANALYZE statements)
 	var name tree.Name
 	switch s.d6() {
 	case 1, 2, 3:
 		name = jobspb.AutoStatsName
-	case 4, 5:
+	case 4:
+		name = jobspb.AutoPartialStatsName
+	case 5:
 		name = s.name("stats")
 	}
 
-	// Pick specific columns ~17% of the time. We only do this for simulated
+	// Pick specific columns ~8% of the time. We only do this for simulated
 	// manual CREATE STATISTICS statements because neither auto stats nor ANALYZE
 	// allow column selection.
 	var columns tree.NameList
-	if name != jobspb.AutoStatsName && name != "" && s.coin() {
+	if name != jobspb.AutoStatsName && name != jobspb.AutoPartialStatsName && name != "" && s.coin() {
 		for _, col := range table.Columns {
 			if !colinfo.IsSystemColumnName(string(col.Name)) {
 				columns = append(columns, col.Name)
@@ -1892,12 +1895,14 @@ func makeCreateStats(s *Smither) (tree.Statement, bool) {
 	}
 
 	var options tree.CreateStatsOptions
-	if name == jobspb.AutoStatsName {
+	if name == jobspb.AutoStatsName || name == jobspb.AutoPartialStatsName {
 		// For auto stats we always set throttling and AOST.
 		options.Throttling = 0.9
 		// For auto stats we use AOST -30s by default, but this will make things
 		// non-deterministic, so we use the smallest legal AOST instead.
 		options.AsOf = tree.AsOfClause{Expr: tree.NewStrVal("-0.001ms")}
+		// For auto partial stats we always set UsingExtremes.
+		options.UsingExtremes = name == jobspb.AutoPartialStatsName
 	} else if name == "" {
 		// ANALYZE only sets AOST.
 		options.AsOf = tree.AsOfClause{Expr: tree.NewStrVal("-0.001ms")}