From f4620bb9c8cd0afebae11945618e8523720c99dd Mon Sep 17 00:00:00 2001 From: Michael Erickson Date: Wed, 2 Nov 2022 12:54:19 -0700 Subject: [PATCH] sql: modulo by prime in shard calculation for hash-sharded indexes We've discovered a case where a combination of non-random data and a power-of-two number of buckets causes an uneven distribution of rows in a hash-sharded index. While this specific case is very contrived, it illustrates a small weakness in the current hash-shard calculation: modulo by a power-of-two number of buckets only uses the last few bits of the hash value. Radu suggested this would be a problem in #67865 and also suggested a fix: add an intermediate modulo by a larger prime before modulo by num buckets, so we'll try that. Fixes: #91109 Epic: None Release note (performance improvement): This change updates the shard calculation of newly-created hash-sharded indexes so that uneven distributions of rows are less likely. --- .../schemaexpr/hash_sharded_compute_expr.go | 19 ++- pkg/sql/catalog/tabledesc/table.go | 3 + .../testdata/logic_test/alter_primary_key | 20 +-- .../testdata/logic_test/create_index | 4 +- .../testdata/logic_test/create_table | 10 +- .../testdata/logic_test/hash_sharded_index | 117 +++++++++++++----- .../execbuilder/testdata/hash_sharded_index | 68 +++++----- 7 files changed, 159 insertions(+), 82 deletions(-) diff --git a/pkg/sql/catalog/schemaexpr/hash_sharded_compute_expr.go b/pkg/sql/catalog/schemaexpr/hash_sharded_compute_expr.go index 88a8e2b0e748..681754e07932 100644 --- a/pkg/sql/catalog/schemaexpr/hash_sharded_compute_expr.go +++ b/pkg/sql/catalog/schemaexpr/hash_sharded_compute_expr.go @@ -12,11 +12,17 @@ package schemaexpr import "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" +// HashShardPrime is the first prime number larger than MaxBucketAllowed. We +// modulo by HashShardPrime in the hash bucket calculation to include more bits +// of the hash value, in case the user has picked a power-of-two number of +// buckets. +const HashShardPrime uint32 = 2053 + // MakeHashShardComputeExpr creates the serialized computed expression for a hash shard // column based on the column names and the number of buckets. The expression will be // of the form: // -// mod(fnv32(crdb_internal.datums_to_bytes(...)),buckets) +// mod(mod(fnv32(crdb_internal.datums_to_bytes(...)),prime),buckets) func MakeHashShardComputeExpr(colNames []string, buckets int) *string { unresolvedFunc := func(funcName string) tree.ResolvableFunctionReference { return tree.ResolvableFunctionReference{ @@ -44,6 +50,15 @@ func MakeHashShardComputeExpr(colNames []string, buckets int) *string { }, } } + modPrime := func(expr tree.Expr) tree.Expr { + return &tree.FuncExpr{ + Func: unresolvedFunc("mod"), + Exprs: tree.Exprs{ + expr, + tree.NewDInt(tree.DInt(HashShardPrime)), + }, + } + } modBuckets := func(expr tree.Expr) tree.Expr { return &tree.FuncExpr{ Func: unresolvedFunc("mod"), @@ -53,6 +68,6 @@ func MakeHashShardComputeExpr(colNames []string, buckets int) *string { }, } } - res := tree.Serialize(modBuckets(hashedColumnsExpr())) + res := tree.Serialize(modBuckets(modPrime(hashedColumnsExpr()))) return &res } diff --git a/pkg/sql/catalog/tabledesc/table.go b/pkg/sql/catalog/tabledesc/table.go index 300846f41190..fc1a7129c7cd 100644 --- a/pkg/sql/catalog/tabledesc/table.go +++ b/pkg/sql/catalog/tabledesc/table.go @@ -57,6 +57,9 @@ type ColumnDefDescs struct { // hash-sharded index or primary key. const MaxBucketAllowed = 2048 +// Ensure that schemaexpr.HashShardPrime > MaxBucketAllowed. +const _ uint = uint(schemaexpr.HashShardPrime) - 1 - uint(MaxBucketAllowed) + // ColExprKind is an enum type of possible expressions on a column // (e.g. 'DEFAULT' expression or 'ON UPDATE' expression). type ColExprKind string diff --git a/pkg/sql/logictest/testdata/logic_test/alter_primary_key b/pkg/sql/logictest/testdata/logic_test/alter_primary_key index 06512541bcaf..0263c5d4d936 100644 --- a/pkg/sql/logictest/testdata/logic_test/alter_primary_key +++ b/pkg/sql/logictest/testdata/logic_test/alter_primary_key @@ -263,7 +263,7 @@ t CREATE TABLE public.t ( z INT8 NOT NULL, w INT8 NULL, v JSONB NULL, - crdb_internal_z_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(z)), 4:::INT8)) VIRTUAL, + crdb_internal_z_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(z)), 2053:::INT8), 4:::INT8)) VIRTUAL, CONSTRAINT t_pkey PRIMARY KEY (y ASC), UNIQUE INDEX i3 (z ASC) STORING (y), UNIQUE INDEX t_x_key (x ASC), @@ -423,8 +423,8 @@ t CREATE TABLE public.t ( x INT8 NOT NULL, y INT8 NOT NULL, z INT8 NULL, - crdb_internal_z_shard_5 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(z)), 5:::INT8)) VIRTUAL, - crdb_internal_y_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(y)), 10:::INT8)) VIRTUAL, + crdb_internal_z_shard_5 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(z)), 2053:::INT8), 5:::INT8)) VIRTUAL, + crdb_internal_y_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(y)), 2053:::INT8), 10:::INT8)) VIRTUAL, CONSTRAINT t_pkey PRIMARY KEY (y ASC) USING HASH WITH (bucket_count=10), UNIQUE INDEX t_x_key (x ASC), INDEX i1 (z ASC) USING HASH WITH (bucket_count=5), @@ -486,7 +486,7 @@ query TT SHOW CREATE t ---- t CREATE TABLE public.t ( - crdb_internal_x_shard_5 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(x)), 5:::INT8)) VIRTUAL, + crdb_internal_x_shard_5 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(x)), 2053:::INT8), 5:::INT8)) VIRTUAL, x INT8 NOT NULL, y INT8 NOT NULL, z INT8 NULL, @@ -638,7 +638,7 @@ SHOW CREATE t t CREATE TABLE public.t ( x INT8 NOT NULL, rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(), - crdb_internal_x_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(x)), 4:::INT8)) VIRTUAL, + crdb_internal_x_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(x)), 2053:::INT8), 4:::INT8)) VIRTUAL, CONSTRAINT t_pkey PRIMARY KEY (x ASC) USING HASH WITH (bucket_count=4) ) @@ -1058,9 +1058,9 @@ query TT SHOW CREATE t ---- t CREATE TABLE public.t ( - crdb_internal_x_shard_2 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(x)), 2:::INT8)) VIRTUAL, + crdb_internal_x_shard_2 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(x)), 2053:::INT8), 2:::INT8)) VIRTUAL, x INT8 NOT NULL, - crdb_internal_x_shard_3 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(x)), 3:::INT8)) VIRTUAL, + crdb_internal_x_shard_3 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(x)), 2053:::INT8), 3:::INT8)) VIRTUAL, CONSTRAINT t_pkey PRIMARY KEY (x ASC) USING HASH WITH (bucket_count=3) ) @@ -1079,10 +1079,10 @@ query TT SHOW CREATE t ---- t CREATE TABLE public.t ( - crdb_internal_x_shard_2 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(x)), 2:::INT8)) VIRTUAL, + crdb_internal_x_shard_2 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(x)), 2053:::INT8), 2:::INT8)) VIRTUAL, x INT8 NOT NULL, y INT8 NOT NULL, - crdb_internal_y_shard_2 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(y)), 2:::INT8)) VIRTUAL, + crdb_internal_y_shard_2 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(y)), 2053:::INT8), 2:::INT8)) VIRTUAL, CONSTRAINT t_pkey PRIMARY KEY (y ASC) USING HASH WITH (bucket_count=2), UNIQUE INDEX t_x_key (x ASC) USING HASH WITH (bucket_count=2), FAMILY fam_0_x_y (x, y) @@ -1550,7 +1550,7 @@ SELECT @2 FROM [SHOW CREATE TABLE t_test_param] CREATE TABLE public.t_test_param ( a INT8 NOT NULL, b INT8 NOT NULL, - crdb_internal_b_shard_5 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(b)), 5:::INT8)) VIRTUAL, + crdb_internal_b_shard_5 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(b)), 2053:::INT8), 5:::INT8)) VIRTUAL, CONSTRAINT t_test_param_pkey PRIMARY KEY (b ASC) USING HASH WITH (bucket_count=5), UNIQUE INDEX t_test_param_a_key (a ASC), FAMILY fam_0_a_b (a, b) diff --git a/pkg/sql/logictest/testdata/logic_test/create_index b/pkg/sql/logictest/testdata/logic_test/create_index index 250118195a08..2a40721be433 100644 --- a/pkg/sql/logictest/testdata/logic_test/create_index +++ b/pkg/sql/logictest/testdata/logic_test/create_index @@ -385,8 +385,8 @@ CREATE TABLE public.t_hash ( pk INT8 NOT NULL, a INT8 NULL, b INT8 NULL, - crdb_internal_a_shard_5 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 5:::INT8)) VIRTUAL, - crdb_internal_b_shard_5 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(b)), 5:::INT8)) VIRTUAL, + crdb_internal_a_shard_5 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 5:::INT8)) VIRTUAL, + crdb_internal_b_shard_5 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(b)), 2053:::INT8), 5:::INT8)) VIRTUAL, CONSTRAINT t_hash_pkey PRIMARY KEY (pk ASC), INDEX idx_t_hash_a (a ASC) USING HASH WITH (bucket_count=5), UNIQUE INDEX idx_t_hash_b (b ASC) USING HASH WITH (bucket_count=5), diff --git a/pkg/sql/logictest/testdata/logic_test/create_table b/pkg/sql/logictest/testdata/logic_test/create_table index 94f496f4a189..5cfd31162dca 100644 --- a/pkg/sql/logictest/testdata/logic_test/create_table +++ b/pkg/sql/logictest/testdata/logic_test/create_table @@ -339,7 +339,7 @@ SHOW CREATE TABLE like_hash ---- like_hash CREATE TABLE public.like_hash ( a INT8 NULL, - crdb_internal_a_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 4:::INT8)) VIRTUAL, + crdb_internal_a_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 4:::INT8)) VIRTUAL, rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(), CONSTRAINT like_hash_pkey PRIMARY KEY (rowid ASC), INDEX like_hash_base_a_idx (a ASC) USING HASH WITH (bucket_count=4) @@ -356,7 +356,7 @@ SHOW CREATE TABLE like_hash ---- like_hash CREATE TABLE public.like_hash ( a INT8 NULL, - crdb_internal_a_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 4:::INT8)) VIRTUAL, + crdb_internal_a_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 4:::INT8)) VIRTUAL, rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(), CONSTRAINT like_hash_pkey PRIMARY KEY (rowid ASC), INDEX like_hash_base_a_idx (a ASC) USING HASH WITH (bucket_count=4) @@ -850,11 +850,11 @@ query T SELECT @2 FROM [SHOW CREATE TABLE t_good_hash_indexes_1]; ---- CREATE TABLE public.t_good_hash_indexes_1 ( - crdb_internal_a_shard_5 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 5:::INT8)) VIRTUAL, + crdb_internal_a_shard_5 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 5:::INT8)) VIRTUAL, a INT8 NOT NULL, b INT8 NULL, c INT8 NULL, - crdb_internal_b_shard_5 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(b)), 5:::INT8)) VIRTUAL, + crdb_internal_b_shard_5 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(b)), 2053:::INT8), 5:::INT8)) VIRTUAL, CONSTRAINT t_good_hash_indexes_1_pkey PRIMARY KEY (a ASC) USING HASH WITH (bucket_count=5), INDEX t_good_hash_indexes_1_b_idx (b ASC) USING HASH WITH (bucket_count=5) ) @@ -870,7 +870,7 @@ SELECT @2 FROM [SHOW CREATE TABLE t_good_hash_indexes_2]; ---- CREATE TABLE public.t_good_hash_indexes_2 ( a INT8 NOT NULL, - crdb_internal_a_shard_5 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 5:::INT8)) VIRTUAL, + crdb_internal_a_shard_5 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 5:::INT8)) VIRTUAL, CONSTRAINT t_good_hash_indexes_2_pkey PRIMARY KEY (a ASC) USING HASH WITH (bucket_count=5) ) diff --git a/pkg/sql/logictest/testdata/logic_test/hash_sharded_index b/pkg/sql/logictest/testdata/logic_test/hash_sharded_index index f43e89f6063e..5d444f6be993 100644 --- a/pkg/sql/logictest/testdata/logic_test/hash_sharded_index +++ b/pkg/sql/logictest/testdata/logic_test/hash_sharded_index @@ -6,7 +6,7 @@ query TT SHOW CREATE TABLE sharded_primary ---- sharded_primary CREATE TABLE public.sharded_primary ( - crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 10:::INT8)) VIRTUAL, + crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 10:::INT8)) VIRTUAL, a INT8 NOT NULL, CONSTRAINT sharded_primary_pkey PRIMARY KEY (a ASC) USING HASH WITH (bucket_count=10) ) @@ -42,7 +42,7 @@ SHOW CREATE TABLE sharded_primary ---- sharded_primary CREATE TABLE public.sharded_primary ( a INT8 NOT NULL, - crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 10:::INT8)) VIRTUAL, + crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 10:::INT8)) VIRTUAL, CONSTRAINT "primary" PRIMARY KEY (a ASC) USING HASH WITH (bucket_count=10) ) @@ -95,7 +95,7 @@ SHOW CREATE TABLE specific_family specific_family CREATE TABLE public.specific_family ( a INT8 NULL, b INT8 NULL, - crdb_internal_b_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(b)), 10:::INT8)) VIRTUAL, + crdb_internal_b_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(b)), 2053:::INT8), 10:::INT8)) VIRTUAL, rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(), CONSTRAINT specific_family_pkey PRIMARY KEY (rowid ASC), INDEX specific_family_b_idx (b ASC) USING HASH WITH (bucket_count=10), @@ -112,7 +112,7 @@ SHOW CREATE TABLE sharded_secondary ---- sharded_secondary CREATE TABLE public.sharded_secondary ( a INT8 NULL, - crdb_internal_a_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 4:::INT8)) VIRTUAL, + crdb_internal_a_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 4:::INT8)) VIRTUAL, rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(), CONSTRAINT sharded_secondary_pkey PRIMARY KEY (rowid ASC), INDEX sharded_secondary_a_idx (a ASC) USING HASH WITH (bucket_count=4) @@ -133,7 +133,7 @@ SHOW CREATE TABLE sharded_secondary ---- sharded_secondary CREATE TABLE public.sharded_secondary ( a INT8 NULL, - crdb_internal_a_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 4:::INT8)) VIRTUAL, + crdb_internal_a_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 4:::INT8)) VIRTUAL, rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(), CONSTRAINT sharded_secondary_pkey PRIMARY KEY (rowid ASC), INDEX sharded_secondary_crdb_internal_a_shard_4_a_idx (a ASC) USING HASH WITH (bucket_count=4) @@ -162,7 +162,7 @@ SHOW CREATE TABLE sharded_secondary sharded_secondary CREATE TABLE public.sharded_secondary ( a INT8 NULL, rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(), - crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 10:::INT8)) VIRTUAL, + crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 10:::INT8)) VIRTUAL, CONSTRAINT sharded_secondary_pkey PRIMARY KEY (rowid ASC), INDEX sharded_secondary_a_idx (a ASC) USING HASH WITH (bucket_count=10) ) @@ -180,8 +180,8 @@ SHOW CREATE TABLE sharded_secondary sharded_secondary CREATE TABLE public.sharded_secondary ( a INT8 NULL, rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(), - crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 10:::INT8)) VIRTUAL, - crdb_internal_a_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 4:::INT8)) VIRTUAL, + crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 10:::INT8)) VIRTUAL, + crdb_internal_a_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 4:::INT8)) VIRTUAL, CONSTRAINT sharded_secondary_pkey PRIMARY KEY (rowid ASC), INDEX sharded_secondary_a_idx (a ASC) USING HASH WITH (bucket_count=10), INDEX sharded_secondary_a_idx1 (a ASC) USING HASH WITH (bucket_count=4) @@ -197,7 +197,7 @@ SHOW CREATE TABLE sharded_secondary sharded_secondary CREATE TABLE public.sharded_secondary ( a INT8 NULL, rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(), - crdb_internal_a_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 4:::INT8)) VIRTUAL, + crdb_internal_a_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 4:::INT8)) VIRTUAL, CONSTRAINT sharded_secondary_pkey PRIMARY KEY (rowid ASC), INDEX sharded_secondary_a_idx1 (a ASC) USING HASH WITH (bucket_count=4) ) @@ -254,7 +254,7 @@ SHOW CREATE TABLE sharded_secondary sharded_secondary CREATE TABLE public.sharded_secondary ( a INT8 NULL, rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(), - crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 10:::INT8)) VIRTUAL, + crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 10:::INT8)) VIRTUAL, CONSTRAINT sharded_secondary_pkey PRIMARY KEY (rowid ASC), INDEX sharded_secondary_a_idx (a ASC) USING HASH WITH (bucket_count=10), INDEX sharded_secondary_a_idx1 (a ASC) USING HASH WITH (bucket_count=10), @@ -276,8 +276,8 @@ SHOW CREATE TABLE sharded_primary ---- sharded_primary CREATE TABLE public.sharded_primary ( a INT8 NOT NULL, - crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 10:::INT8)) VIRTUAL, - crdb_internal_a_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 4:::INT8)) VIRTUAL, + crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 10:::INT8)) VIRTUAL, + crdb_internal_a_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 4:::INT8)) VIRTUAL, CONSTRAINT "primary" PRIMARY KEY (a ASC) USING HASH WITH (bucket_count=10), INDEX sharded_primary_a_idx (a ASC) USING HASH WITH (bucket_count=4) ) @@ -293,7 +293,7 @@ SHOW CREATE TABLE sharded_primary ---- sharded_primary CREATE TABLE public.sharded_primary ( a INT8 NOT NULL, - crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 10:::INT8)) VIRTUAL, + crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 10:::INT8)) VIRTUAL, CONSTRAINT "primary" PRIMARY KEY (a ASC) USING HASH WITH (bucket_count=10) ) @@ -305,7 +305,7 @@ SHOW CREATE TABLE sharded_primary ---- sharded_primary CREATE TABLE public.sharded_primary ( a INT8 NOT NULL, - crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 10:::INT8)) VIRTUAL, + crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 10:::INT8)) VIRTUAL, CONSTRAINT "primary" PRIMARY KEY (a ASC) USING HASH WITH (bucket_count=10), INDEX sharded_primary_a_idx (a ASC) USING HASH WITH (bucket_count=10) ) @@ -383,7 +383,7 @@ SHOW CREATE TABLE column_used_on_unsharded ---- column_used_on_unsharded CREATE TABLE public.column_used_on_unsharded ( a INT8 NULL, - crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 10:::INT8)) VIRTUAL, + crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 10:::INT8)) VIRTUAL, rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(), CONSTRAINT column_used_on_unsharded_pkey PRIMARY KEY (rowid ASC), INDEX column_used_on_unsharded_crdb_internal_a_shard_10_idx (crdb_internal_a_shard_10 ASC) @@ -407,7 +407,7 @@ SHOW CREATE TABLE column_used_on_unsharded_create_table ---- column_used_on_unsharded_create_table CREATE TABLE public.column_used_on_unsharded_create_table ( a INT8 NULL, - crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 10:::INT8)) VIRTUAL, + crdb_internal_a_shard_10 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 10:::INT8)) VIRTUAL, rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(), CONSTRAINT column_used_on_unsharded_create_table_pkey PRIMARY KEY (rowid ASC), INDEX column_used_on_unsharded_create_table_crdb_internal_a_shard_10_idx (crdb_internal_a_shard_10 ASC) @@ -442,10 +442,10 @@ query TT SHOW CREATE TABLE weird_names ---- weird_names CREATE TABLE public.weird_names ( - "crdb_internal_I am a column with spaces_shard_12" INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes("I am a column with spaces")), 12:::INT8)) VIRTUAL, + "crdb_internal_I am a column with spaces_shard_12" INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes("I am a column with spaces")), 2053:::INT8), 12:::INT8)) VIRTUAL, "I am a column with spaces" INT8 NOT NULL, "'quotes' in the column's name" INT8 NULL, - "crdb_internal_'quotes' in the column's name_shard_4" INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes("'quotes' in the column's name")), 4:::INT8)) VIRTUAL, + "crdb_internal_'quotes' in the column's name_shard_4" INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes("'quotes' in the column's name")), 2053:::INT8), 4:::INT8)) VIRTUAL, CONSTRAINT weird_names_pkey PRIMARY KEY ("I am a column with spaces" ASC) USING HASH WITH (bucket_count=12), INDEX foo ("'quotes' in the column's name" ASC) USING HASH WITH (bucket_count=4) ) @@ -519,8 +519,8 @@ rename_column CREATE TABLE public.rename_column ( c0 INT8 NOT NULL, c1 INT8 NOT NULL, c2 INT8 NULL, - crdb_internal_c0_c1_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(c0, c1)), 8:::INT8)) VIRTUAL, - crdb_internal_c2_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(c2)), 8:::INT8)) VIRTUAL, + crdb_internal_c0_c1_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(c0, c1)), 2053:::INT8), 8:::INT8)) VIRTUAL, + crdb_internal_c2_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(c2)), 2053:::INT8), 8:::INT8)) VIRTUAL, CONSTRAINT rename_column_pkey PRIMARY KEY (c0 ASC, c1 ASC) USING HASH WITH (bucket_count=8), INDEX rename_column_c2_idx (c2 ASC) USING HASH WITH (bucket_count=8) ) @@ -542,8 +542,8 @@ rename_column CREATE TABLE public.rename_column ( c1 INT8 NOT NULL, c2 INT8 NOT NULL, c3 INT8 NULL, - crdb_internal_c1_c2_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(c1, c2)), 8:::INT8)) VIRTUAL, - crdb_internal_c3_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(c3)), 8:::INT8)) VIRTUAL, + crdb_internal_c1_c2_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(c1, c2)), 2053:::INT8), 8:::INT8)) VIRTUAL, + crdb_internal_c3_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(c3)), 2053:::INT8), 8:::INT8)) VIRTUAL, CONSTRAINT rename_column_pkey PRIMARY KEY (c1 ASC, c2 ASC) USING HASH WITH (bucket_count=8), INDEX rename_column_c2_idx (c3 ASC) USING HASH WITH (bucket_count=8) ) @@ -564,8 +564,8 @@ rename_column CREATE TABLE public.rename_column ( c0 INT8 NOT NULL, c1 INT8 NOT NULL, c2 INT8 NULL, - crdb_internal_c0_c1_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(c0, c1)), 8:::INT8)) VIRTUAL, - crdb_internal_c2_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(c2)), 8:::INT8)) VIRTUAL, + crdb_internal_c0_c1_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(c0, c1)), 2053:::INT8), 8:::INT8)) VIRTUAL, + crdb_internal_c2_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(c2)), 2053:::INT8), 8:::INT8)) VIRTUAL, CONSTRAINT rename_column_pkey PRIMARY KEY (c0 ASC, c1 ASC) USING HASH WITH (bucket_count=8), INDEX rename_column_c2_idx (c2 ASC) USING HASH WITH (bucket_count=8) ) @@ -772,7 +772,7 @@ query T SELECT @2 FROM [SHOW CREATE TABLE t] ---- CREATE TABLE public.t ( - crdb_internal_a_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 8:::INT8)) VIRTUAL, + crdb_internal_a_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 8:::INT8)) VIRTUAL, a INT8 NOT NULL, CONSTRAINT t_pkey PRIMARY KEY (a ASC) USING HASH WITH (bucket_count=8) ) @@ -859,12 +859,12 @@ query T SELECT @2 FROM [SHOW CREATE TABLE t_default_bucket_16] ---- CREATE TABLE public.t_default_bucket_16 ( - crdb_internal_a_shard_16 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 16:::INT8)) VIRTUAL, + crdb_internal_a_shard_16 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 16:::INT8)) VIRTUAL, a INT8 NOT NULL, b INT8 NULL, c INT8 NULL, - crdb_internal_b_shard_16 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(b)), 16:::INT8)) VIRTUAL, - crdb_internal_c_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(c)), 4:::INT8)) VIRTUAL, + crdb_internal_b_shard_16 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(b)), 2053:::INT8), 16:::INT8)) VIRTUAL, + crdb_internal_c_shard_4 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(c)), 2053:::INT8), 4:::INT8)) VIRTUAL, CONSTRAINT t_default_bucket_16_pkey PRIMARY KEY (a ASC) USING HASH WITH (bucket_count=16), INDEX idx_t_default_bucket_16_b (b ASC) USING HASH WITH (bucket_count=16), INDEX idx_t_default_bucket_16_c (c ASC) USING HASH WITH (bucket_count=4), @@ -882,7 +882,7 @@ query T SELECT @2 FROM [SHOW CREATE TABLE t_default_bucket_8] ---- CREATE TABLE public.t_default_bucket_8 ( - crdb_internal_a_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 8:::INT8)) VIRTUAL, + crdb_internal_a_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 8:::INT8)) VIRTUAL, a INT8 NOT NULL, CONSTRAINT t_default_bucket_8_pkey PRIMARY KEY (a ASC) USING HASH WITH (bucket_count=8) ) @@ -1064,3 +1064,62 @@ COMMIT; statement ok DROP TABLE products; + +# Ensure that rows are at least somewhat evenly distributed in a few simple +# cases (testcase for #91109). +statement ok +CREATE TABLE t91109 (i, j, k) AS SELECT x, x, x FROM generate_series(0, 1023) s (x); + +statement ok +CREATE INDEX ON t91109 (i) USING HASH WITH BUCKET_COUNT = 8; + +statement ok +CREATE INDEX ON t91109 (i, j) USING HASH WITH BUCKET_COUNT = 8; + +statement ok +CREATE INDEX ON t91109 (i, j, k) USING HASH WITH BUCKET_COUNT = 8; + +query II +SELECT crdb_internal_i_shard_8, (COUNT(crdb_internal_i_shard_8) + 32) >> 7 +FROM t91109 +GROUP BY 1 ORDER BY 1 +---- +0 1 +1 1 +2 1 +3 1 +4 1 +5 1 +6 1 +7 1 + +query II +SELECT crdb_internal_i_j_shard_8, (COUNT(crdb_internal_i_j_shard_8) + 32) >> 7 +FROM t91109 +GROUP BY 1 ORDER BY 1 +---- +0 1 +1 1 +2 1 +3 1 +4 1 +5 1 +6 1 +7 1 + +query II +SELECT crdb_internal_i_j_k_shard_8, (COUNT(crdb_internal_i_j_k_shard_8) + 32) >> 7 +FROM t91109 +GROUP BY 1 ORDER BY 1 +---- +0 1 +1 1 +2 1 +3 1 +4 1 +5 1 +6 1 +7 1 + +statement ok +DROP TABLE t91109 diff --git a/pkg/sql/opt/exec/execbuilder/testdata/hash_sharded_index b/pkg/sql/opt/exec/execbuilder/testdata/hash_sharded_index index f4437e37543a..539270867dda 100644 --- a/pkg/sql/opt/exec/execbuilder/testdata/hash_sharded_index +++ b/pkg/sql/opt/exec/execbuilder/testdata/hash_sharded_index @@ -34,7 +34,7 @@ vectorized: true │ └── • render │ columns: (crdb_internal_a_shard_11_comp, column1) - │ render crdb_internal_a_shard_11_comp: mod(fnv32(crdb_internal.datums_to_bytes(column1)), 11) + │ render crdb_internal_a_shard_11_comp: mod(mod(fnv32(crdb_internal.datums_to_bytes(column1)), 2053), 11) │ render column1: column1 │ └── • values @@ -314,7 +314,7 @@ vectorized: true │ └── • render │ columns: (crdb_internal_a_shard_12_comp, rowid_default, column1) - │ render crdb_internal_a_shard_12_comp: mod(fnv32(crdb_internal.datums_to_bytes(column1)), 12) + │ render crdb_internal_a_shard_12_comp: mod(mod(fnv32(crdb_internal.datums_to_bytes(column1)), 2053), 12) │ render rowid_default: unique_rowid() │ render column1: column1 │ @@ -532,7 +532,7 @@ vectorized: true columns: (i2, i4, i8, f4, f8, s, c, b, dc, ival, oid, tstz, ts, da, inet, vb) estimated row count: 1 (missing stats) table: sharded_primary_with_many_column_types@sharded_primary_with_many_column_types_pkey - spans: /5/1/1/1/1/1/"1"/"1"/"1"/1/00:00:01/1/1970-01-01T00:00:01Z/1970-01-01T00:00:01Z/1/"\x00 \x7f\x00\x00\x01"/B1/0 + spans: /3/1/1/1/1/1/"1"/"1"/"1"/1/00:00:01/1/1970-01-01T00:00:01Z/1970-01-01T00:00:01Z/1/"\x00 \x7f\x00\x00\x01"/B1/0 # Test to make sure constraint on shard column value is added correctly when # creating a table with output show create table. @@ -547,13 +547,13 @@ query T EXPLAIN (OPT, CATALOG) SELECT * FROM t ---- TABLE t - ├── crdb_internal_a_shard_8 int not null as (mod(fnv32(crdb_internal.datums_to_bytes(a)), 8:::INT8)) stored [hidden] + ├── crdb_internal_a_shard_8 int not null as (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 8:::INT8)) stored [hidden] ├── a int not null ├── crdb_internal_mvcc_timestamp decimal [hidden] [system] ├── tableoid oid [hidden] [system] ├── CHECK (crdb_internal_a_shard_8 IN (0:::INT8, 1:::INT8, 2:::INT8, 3:::INT8, 4:::INT8, 5:::INT8, 6:::INT8, 7:::INT8)) ├── PRIMARY INDEX t_pkey - │ ├── crdb_internal_a_shard_8 int not null as (mod(fnv32(crdb_internal.datums_to_bytes(a)), 8:::INT8)) stored [hidden] (implicit) + │ ├── crdb_internal_a_shard_8 int not null as (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 8:::INT8)) stored [hidden] (implicit) │ └── a int not null └── UNIQUE WITHOUT INDEX (a) scan t @@ -561,7 +561,7 @@ scan t │ └── crdb_internal_a_shard_8 IN (0, 1, 2, 3, 4, 5, 6, 7) └── computed column expressions └── crdb_internal_a_shard_8 - └── mod(fnv32(crdb_internal.datums_to_bytes(a)), 8) + └── mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053), 8) let $create_statement SELECT create_statement FROM [SHOW CREATE TABLE t] @@ -576,7 +576,7 @@ query T SELECT @2 FROM [SHOW CREATE TABLE t] ---- CREATE TABLE public.t ( - crdb_internal_a_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(fnv32(crdb_internal.datums_to_bytes(a)), 8:::INT8)) VIRTUAL, + crdb_internal_a_shard_8 INT8 NOT VISIBLE NOT NULL AS (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 8:::INT8)) VIRTUAL, a INT8 NOT NULL, CONSTRAINT t_pkey PRIMARY KEY (a ASC) USING HASH WITH (bucket_count=8) ) @@ -585,13 +585,13 @@ query T EXPLAIN (OPT, CATALOG) SELECT * FROM t ---- TABLE t - ├── crdb_internal_a_shard_8 int not null as (mod(fnv32(crdb_internal.datums_to_bytes(a)), 8:::INT8)) stored [hidden] + ├── crdb_internal_a_shard_8 int not null as (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 8:::INT8)) stored [hidden] ├── a int not null ├── crdb_internal_mvcc_timestamp decimal [hidden] [system] ├── tableoid oid [hidden] [system] ├── CHECK (crdb_internal_a_shard_8 IN (0:::INT8, 1:::INT8, 2:::INT8, 3:::INT8, 4:::INT8, 5:::INT8, 6:::INT8, 7:::INT8)) ├── PRIMARY INDEX t_pkey - │ ├── crdb_internal_a_shard_8 int not null as (mod(fnv32(crdb_internal.datums_to_bytes(a)), 8:::INT8)) stored [hidden] (implicit) + │ ├── crdb_internal_a_shard_8 int not null as (mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053:::INT8), 8:::INT8)) stored [hidden] (implicit) │ └── a int not null └── UNIQUE WITHOUT INDEX (a) scan t @@ -599,7 +599,7 @@ scan t │ └── crdb_internal_a_shard_8 IN (0, 1, 2, 3, 4, 5, 6, 7) └── computed column expressions └── crdb_internal_a_shard_8 - └── mod(fnv32(crdb_internal.datums_to_bytes(a)), 8) + └── mod(mod(fnv32(crdb_internal.datums_to_bytes(a)), 2053), 8) # Test to make sure unqiueness checks are omitted for unique without index @@ -625,7 +625,7 @@ vectorized: true into: t_hash_indexed(crdb_internal_a_shard_8, a, b) auto commit size: 4 columns, 1 row - row 0, expr 0: 1 + row 0, expr 0: 2 row 0, expr 1: 4321 row 0, expr 2: 8765 row 0, expr 3: true @@ -646,7 +646,7 @@ vectorized: true └── • render │ columns: (crdb_internal_a_shard_8, a, b, crdb_internal_a_shard_8_comp, a_new, check1) │ render check1: true - │ render crdb_internal_a_shard_8_comp: 1 + │ render crdb_internal_a_shard_8_comp: 2 │ render a_new: 4321 │ render crdb_internal_a_shard_8: crdb_internal_a_shard_8 │ render a: a @@ -679,7 +679,7 @@ vectorized: true size: 4 columns, 1 row row 0, expr 0: 4321 row 0, expr 1: 8765 - row 0, expr 2: 1 + row 0, expr 2: 2 row 0, expr 3: true query T @@ -712,7 +712,7 @@ vectorized: true │ └── • render │ columns: (upsert_crdb_internal_a_shard_8, upsert_a, column1, column2, crdb_internal_a_shard_8_comp, crdb_internal_a_shard_8, a, b) - │ render upsert_crdb_internal_a_shard_8: CASE WHEN crdb_internal_a_shard_8 IS NULL THEN crdb_internal_a_shard_8_comp ELSE 1 END + │ render upsert_crdb_internal_a_shard_8: CASE WHEN crdb_internal_a_shard_8 IS NULL THEN crdb_internal_a_shard_8_comp ELSE 2 END │ render upsert_a: CASE WHEN crdb_internal_a_shard_8 IS NULL THEN column1 ELSE 4321 END │ render column1: column1 │ render column2: column2 @@ -730,13 +730,13 @@ vectorized: true │ size: 3 columns, 1 row │ row 0, expr 0: 4321 │ row 0, expr 1: 8765 - │ row 0, expr 2: 1 + │ row 0, expr 2: 2 │ └── • scan columns: (crdb_internal_a_shard_8, a, b) estimated row count: 1 (missing stats) table: t_hash_indexed@t_hash_indexed_pkey - spans: /1/4321/0 + spans: /2/4321/0 locking strength: for update query T @@ -768,13 +768,13 @@ vectorized: true │ size: 3 columns, 1 row │ row 0, expr 0: 4321 │ row 0, expr 1: 8765 - │ row 0, expr 2: 1 + │ row 0, expr 2: 2 │ └── • scan columns: (a) estimated row count: 1 (missing stats) table: t_hash_indexed@t_hash_indexed_pkey - spans: /1/4321/0 + spans: /2/4321/0 query T EXPLAIN (VERBOSE) INSERT INTO t_hash_indexed VALUES (4321, 8765) ON CONFLICT (a) DO NOTHING @@ -805,13 +805,13 @@ vectorized: true │ size: 3 columns, 1 row │ row 0, expr 0: 4321 │ row 0, expr 1: 8765 - │ row 0, expr 2: 1 + │ row 0, expr 2: 2 │ └── • scan columns: (a) estimated row count: 1 (missing stats) table: t_hash_indexed@t_hash_indexed_pkey - spans: /1/4321/0 + spans: /2/4321/0 # Test to make sure unqiueness checks are omitted for unique without index # constraints that are derived from hash-sharded indexes on secondary index. @@ -865,7 +865,7 @@ vectorized: true │ render check1: true │ render crdb_internal_b_shard_8_comp: 3 │ render b_new: 8765 - │ render crdb_internal_b_shard_8: mod(fnv32(crdb_internal.datums_to_bytes(b)), 8) + │ render crdb_internal_b_shard_8: mod(mod(fnv32(crdb_internal.datums_to_bytes(b)), 2053), 8) │ render a: a │ render b: b │ @@ -915,7 +915,7 @@ vectorized: true │ └── • render │ columns: (crdb_internal_b_shard_8, a, b) - │ render crdb_internal_b_shard_8: mod(fnv32(crdb_internal.datums_to_bytes(b)), 8) + │ render crdb_internal_b_shard_8: mod(mod(fnv32(crdb_internal.datums_to_bytes(b)), 2053), 8) │ render a: a │ render b: b │ @@ -977,7 +977,7 @@ vectorized: true │ └── • render │ columns: (crdb_internal_b_shard_8, a, b) - │ render crdb_internal_b_shard_8: mod(fnv32(crdb_internal.datums_to_bytes(b)), 8) + │ render crdb_internal_b_shard_8: mod(mod(fnv32(crdb_internal.datums_to_bytes(b)), 2053), 8) │ render a: a │ render b: b │ @@ -1039,7 +1039,7 @@ vectorized: true │ └── • render │ columns: (crdb_internal_b_shard_8, a, b) - │ render crdb_internal_b_shard_8: mod(fnv32(crdb_internal.datums_to_bytes(b)), 8) + │ render crdb_internal_b_shard_8: mod(mod(fnv32(crdb_internal.datums_to_bytes(b)), 2053), 8) │ render a: a │ render b: b │ @@ -1077,7 +1077,7 @@ vectorized: true │ └── • render │ columns: (crdb_internal_b_shard_8, column1, column2, crdb_internal_b_shard_8_comp, a, b) - │ render crdb_internal_b_shard_8: CASE a IS NULL WHEN true THEN CAST(NULL AS INT8) ELSE mod(fnv32(crdb_internal.datums_to_bytes(b)), 8) END + │ render crdb_internal_b_shard_8: CASE a IS NULL WHEN true THEN CAST(NULL AS INT8) ELSE mod(mod(fnv32(crdb_internal.datums_to_bytes(b)), 2053), 8) END │ render column1: column1 │ render column2: column2 │ render crdb_internal_b_shard_8_comp: crdb_internal_b_shard_8_comp @@ -1097,8 +1097,8 @@ vectorized: true │ └── • render │ columns: (crdb_internal_b_shard_8_eq, crdb_internal_b_shard_8_comp, column1, column2) - │ render crdb_internal_b_shard_8_eq: mod(fnv32(crdb_internal.datums_to_bytes(column2)), 8) - │ render crdb_internal_b_shard_8_comp: mod(fnv32(crdb_internal.datums_to_bytes(column2)), 8) + │ render crdb_internal_b_shard_8_eq: mod(mod(fnv32(crdb_internal.datums_to_bytes(column2)), 2053), 8) + │ render crdb_internal_b_shard_8_comp: mod(mod(fnv32(crdb_internal.datums_to_bytes(column2)), 2053), 8) │ render column1: column1 │ render column2: column2 │ @@ -1143,7 +1143,7 @@ vectorized: true │ └── • render │ columns: (crdb_internal_b_shard_8_eq, column1, column2, crdb_internal_b_shard_8_comp) - │ render crdb_internal_b_shard_8_eq: mod(fnv32(crdb_internal.datums_to_bytes(column2)), 8) + │ render crdb_internal_b_shard_8_eq: mod(mod(fnv32(crdb_internal.datums_to_bytes(column2)), 2053), 8) │ render column1: column1 │ render column2: column2 │ render crdb_internal_b_shard_8_comp: crdb_internal_b_shard_8_comp @@ -1201,7 +1201,7 @@ vectorized: true │ └── • render │ columns: (crdb_internal_b_shard_8_eq, column1, column2, crdb_internal_b_shard_8_comp) - │ render crdb_internal_b_shard_8_eq: mod(fnv32(crdb_internal.datums_to_bytes(column2)), 8) + │ render crdb_internal_b_shard_8_eq: mod(mod(fnv32(crdb_internal.datums_to_bytes(column2)), 2053), 8) │ render column1: column1 │ render column2: column2 │ render crdb_internal_b_shard_8_comp: crdb_internal_b_shard_8_comp @@ -1215,7 +1215,7 @@ vectorized: true │ └── • render │ columns: (crdb_internal_b_shard_8_comp, column1, column2) - │ render crdb_internal_b_shard_8_comp: mod(fnv32(crdb_internal.datums_to_bytes(column2)), 8) + │ render crdb_internal_b_shard_8_comp: mod(mod(fnv32(crdb_internal.datums_to_bytes(column2)), 2053), 8) │ render column1: column1 │ render column2: column2 │ @@ -1299,8 +1299,8 @@ vectorized: true │ └── • render │ columns: (crdb_internal_b_shard_8_eq, crdb_internal_b_shard_8_comp, column1, column2) - │ render crdb_internal_b_shard_8_eq: mod(fnv32(crdb_internal.datums_to_bytes(column2)), 8) - │ render crdb_internal_b_shard_8_comp: mod(fnv32(crdb_internal.datums_to_bytes(column2)), 8) + │ render crdb_internal_b_shard_8_eq: mod(mod(fnv32(crdb_internal.datums_to_bytes(column2)), 2053), 8) + │ render crdb_internal_b_shard_8_comp: mod(mod(fnv32(crdb_internal.datums_to_bytes(column2)), 2053), 8) │ render column1: column1 │ render column2: column2 │ @@ -1367,7 +1367,7 @@ vectorized: true │ └── • render │ columns: (crdb_internal_id_shard_16_eq, pid) - │ render crdb_internal_id_shard_16_eq: mod(fnv32(crdb_internal.datums_to_bytes(column2)), 16) + │ render crdb_internal_id_shard_16_eq: mod(mod(fnv32(crdb_internal.datums_to_bytes(column2)), 2053), 16) │ render pid: column2 │ └── • project @@ -1436,7 +1436,7 @@ vectorized: true │ └── • render │ columns: (crdb_internal_real_id_shard_16_eq, pid) - │ render crdb_internal_real_id_shard_16_eq: mod(fnv32(crdb_internal.datums_to_bytes(column2)), 16) + │ render crdb_internal_real_id_shard_16_eq: mod(mod(fnv32(crdb_internal.datums_to_bytes(column2)), 2053), 16) │ render pid: column2 │ └── • project