diff --git a/pkg/sql/logictest/testdata/logic_test/privilege_builtins b/pkg/sql/logictest/testdata/logic_test/privilege_builtins index 161aa3f4ae08..e1b49d8603f1 100644 --- a/pkg/sql/logictest/testdata/logic_test/privilege_builtins +++ b/pkg/sql/logictest/testdata/logic_test/privilege_builtins @@ -951,3 +951,36 @@ query B SELECT has_type_privilege('bar', 'text'::REGTYPE::OID, 'USAGE') ---- true + +# Regression test for #39703. + +statement ok +DROP TABLE IF EXISTS hcp_test; CREATE TABLE hcp_test (a INT8, b INT8, c INT8) + +statement ok +ALTER TABLE hcp_test DROP COLUMN b + +query TI +SELECT attname, attnum FROM pg_attribute WHERE attrelid = 'hcp_test'::REGCLASS +---- +a 1 +c 3 +rowid 4 + +query B +SELECT has_column_privilege('hcp_test'::REGCLASS, 1, 'SELECT') +---- +true + +statement error column 2 of relation hcp_test does not exist +SELECT has_column_privilege('hcp_test'::REGCLASS, 2, 'SELECT') + +query B +SELECT has_column_privilege('hcp_test'::REGCLASS, 3, 'SELECT') +---- +true + +query B +SELECT has_column_privilege('hcp_test'::REGCLASS, 4, 'SELECT') +---- +true diff --git a/pkg/sql/sem/builtins/pg_builtins.go b/pkg/sql/sem/builtins/pg_builtins.go index 2ff80f98e036..3b7da4945f6d 100644 --- a/pkg/sql/sem/builtins/pg_builtins.go +++ b/pkg/sql/sem/builtins/pg_builtins.go @@ -1031,19 +1031,23 @@ SELECT description colArg := tree.UnwrapDatum(ctx, args[1]) switch t := colArg.(type) { case *tree.DString: - colPred = "column_name = $1" + // When colArg is a string, it specifies the attribute name. + colPred = "attname = $1" case *tree.DInt: - colPred = "ordinal_position = $1" + // When colArg is an integer, it specifies the attribute number. + colPred = "attnum = $1" default: - log.Fatalf(ctx.Ctx(), "expected arg type %T", t) + log.Fatalf(ctx.Ctx(), "unexpected arg type %T", t) } if r, err := ctx.InternalExecutor.QueryRow( ctx.Ctx(), "has-column-privilege", ctx.Txn, fmt.Sprintf(` - SELECT column_name FROM information_schema.columns - WHERE %s AND %s`, pred, colPred), colArg); err != nil { + SELECT attname FROM pg_attribute + WHERE attrelid = '%s.%s.%s'::REGCLASS AND %s`, + tn.CatalogName, tn.SchemaName, tn.TableName, colPred), colArg, + ); err != nil { return nil, err } else if r == nil { return nil, pgerror.Newf(pgcode.UndefinedColumn,