Skip to content

Commit ba6c245

Browse files
committed
sql: fix bug where some session vars couldn't be set to "on" or "off"
Session variables were incorrectly erroring out on string inputs even though string values of "on" and "off" are accepted. Fixes #46161. Release justification: bug fix Release note (bug fix): This PR fixes a bug where various session variables whose value would display as "on" or "off" could not be set to the values "on" or "off", only true or false.
1 parent ea8db5e commit ba6c245

File tree

2 files changed

+37
-21
lines changed

2 files changed

+37
-21
lines changed

pkg/sql/logictest/testdata/logic_test/set

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,3 +319,14 @@ SET DATESTYLE = ISO;
319319
SET lock_timeout = 0;
320320
SET idle_in_transaction_session_timeout = 0;
321321
SET row_security = off;
322+
323+
# Ensure that we can set variables to on/off.
324+
statement ok
325+
SET enable_zigzag_join = 'on';
326+
SET enable_zigzag_join = 'off';
327+
SET enable_zigzag_join = 'true';
328+
SET enable_zigzag_join = 'false';
329+
SET enable_zigzag_join = on;
330+
SET enable_zigzag_join = off;
331+
SET enable_zigzag_join = true;
332+
SET enable_zigzag_join = false

pkg/sql/vars.go

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ var varGen = map[string]sessionVar{
291291
},
292292
// See https://www.postgresql.org/docs/9.3/static/runtime-config-client.html#GUC-DEFAULT-TRANSACTION-READ-ONLY
293293
`default_transaction_read_only`: {
294-
GetStringVal: makeBoolGetStringValFn("default_transaction_read_only"),
294+
GetStringVal: makePostgresBoolGetStringValFn("default_transaction_read_only"),
295295
Set: func(_ context.Context, m *sessionDataMutator, s string) error {
296296
b, err := parsePostgresBool(s)
297297
if err != nil {
@@ -326,7 +326,7 @@ var varGen = map[string]sessionVar{
326326

327327
// CockroachDB extension.
328328
`experimental_force_split_at`: {
329-
GetStringVal: makeBoolGetStringValFn(`experimental_force_split_at`),
329+
GetStringVal: makePostgresBoolGetStringValFn(`experimental_force_split_at`),
330330
Set: func(_ context.Context, m *sessionDataMutator, s string) error {
331331
b, err := parsePostgresBool(s)
332332
if err != nil {
@@ -343,7 +343,7 @@ var varGen = map[string]sessionVar{
343343

344344
// CockroachDB extension.
345345
`enable_zigzag_join`: {
346-
GetStringVal: makeBoolGetStringValFn(`enable_zigzag_join`),
346+
GetStringVal: makePostgresBoolGetStringValFn(`enable_zigzag_join`),
347347
Set: func(_ context.Context, m *sessionDataMutator, s string) error {
348348
b, err := parsePostgresBool(s)
349349
if err != nil {
@@ -445,7 +445,7 @@ var varGen = map[string]sessionVar{
445445

446446
// CockroachDB extension.
447447
`experimental_optimizer_foreign_keys`: {
448-
GetStringVal: makeBoolGetStringValFn(`experimental_optimizer_foreign_keys`),
448+
GetStringVal: makePostgresBoolGetStringValFn(`experimental_optimizer_foreign_keys`),
449449
Set: func(_ context.Context, m *sessionDataMutator, s string) error {
450450
b, err := parsePostgresBool(s)
451451
if err != nil {
@@ -513,7 +513,7 @@ var varGen = map[string]sessionVar{
513513
Get: func(evalCtx *extendedEvalContext) string {
514514
return formatBoolAsPostgresSetting(evalCtx.SessionData.ForceSavepointRestart)
515515
},
516-
GetStringVal: makeBoolGetStringValFn("force_savepoint_restart"),
516+
GetStringVal: makePostgresBoolGetStringValFn("force_savepoint_restart"),
517517
Set: func(_ context.Context, m *sessionDataMutator, val string) error {
518518
b, err := parsePostgresBool(val)
519519
if err != nil {
@@ -577,7 +577,7 @@ var varGen = map[string]sessionVar{
577577
Get: func(evalCtx *extendedEvalContext) string {
578578
return formatBoolAsPostgresSetting(evalCtx.SessionData.SafeUpdates)
579579
},
580-
GetStringVal: makeBoolGetStringValFn("sql_safe_updates"),
580+
GetStringVal: makePostgresBoolGetStringValFn("sql_safe_updates"),
581581
Set: func(_ context.Context, m *sessionDataMutator, s string) error {
582582
b, err := parsePostgresBool(s)
583583
if err != nil {
@@ -750,7 +750,7 @@ var varGen = map[string]sessionVar{
750750

751751
// See https://www.postgresql.org/docs/10/static/hot-standby.html#HOT-STANDBY-USERS
752752
`transaction_read_only`: {
753-
GetStringVal: makeBoolGetStringValFn("transaction_read_only"),
753+
GetStringVal: makePostgresBoolGetStringValFn("transaction_read_only"),
754754
Set: func(_ context.Context, m *sessionDataMutator, s string) error {
755755
b, err := parsePostgresBool(s)
756756
if err != nil {
@@ -824,11 +824,23 @@ func init() {
824824
}
825825
}
826826

827-
func makeBoolGetStringValFn(varName string) getStringValFn {
827+
// makePostgresBoolGetStringValFn returns a function that evaluates and returns
828+
// a string representation of the first argument value.
829+
func makePostgresBoolGetStringValFn(varName string) getStringValFn {
828830
return func(
829831
ctx context.Context, evalCtx *extendedEvalContext, values []tree.TypedExpr,
830832
) (string, error) {
831-
s, err := getSingleBool(varName, evalCtx, values)
833+
if len(values) != 1 {
834+
return "", newSingleArgVarError(varName)
835+
}
836+
val, err := values[0].Eval(&evalCtx.EvalContext)
837+
if err != nil {
838+
return "", err
839+
}
840+
if s, ok := val.(*tree.DString); ok {
841+
return string(*s), nil
842+
}
843+
s, err := getSingleBool(varName, val)
832844
if err != nil {
833845
return "", err
834846
}
@@ -937,22 +949,15 @@ var varNames = func() []string {
937949
return res
938950
}()
939951

940-
func getSingleBool(
941-
name string, evalCtx *extendedEvalContext, values []tree.TypedExpr,
942-
) (*tree.DBool, error) {
943-
if len(values) != 1 {
944-
return nil, newSingleArgVarError(name)
945-
}
946-
val, err := values[0].Eval(&evalCtx.EvalContext)
947-
if err != nil {
948-
return nil, err
949-
}
952+
// getSingleBool returns the boolean if the input Datum is a DBool,
953+
// and returns a detailed error message if not.
954+
func getSingleBool(name string, val tree.Datum) (*tree.DBool, error) {
950955
b, ok := val.(*tree.DBool)
951956
if !ok {
952-
err = pgerror.Newf(pgcode.InvalidParameterValue,
957+
err := pgerror.Newf(pgcode.InvalidParameterValue,
953958
"parameter %q requires a Boolean value", name)
954959
err = errors.WithDetailf(err,
955-
"%s is a %s", values[0], errors.Safe(val.ResolvedType()))
960+
"%s is a %s", val, errors.Safe(val.ResolvedType()))
956961
return nil, err
957962
}
958963
return b, nil

0 commit comments

Comments
 (0)