Skip to content

Commit 608fc3b

Browse files
Allow -r without argument, defaulting to 0
ODBC sqlcmd allows -r without an explicit value, defaulting to 0 (enable stderr redirection for severity >= 11). Previously go-sqlcmd required -r0 or -r1 explicitly. Changes: - normalizeFlags: Accept empty value for -r flag - getOptionalIntArgument: Return 0 for empty value instead of -1 - Add TestErrorsToStderrDefaultValue test
1 parent 758fca9 commit 608fc3b

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

cmd/sqlcmd/sqlcmd.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,11 @@ func getOptionalIntArgument(cmd *cobra.Command, name string) (i *int) {
376376
if val != nil && val.Changed {
377377
i = new(int)
378378
value := val.Value.String()
379+
// Handle empty value for flags that allow no argument (e.g., -r without value defaults to 0)
380+
if value == "" {
381+
*i = 0
382+
return
383+
}
379384
v, e := strconv.Atoi(value)
380385
if e != nil {
381386
*i = -1
@@ -513,7 +518,7 @@ func normalizeFlags(cmd *cobra.Command) error {
513518
}
514519
case errorsToStderr:
515520
switch v {
516-
case "0", "1":
521+
case "0", "1", "":
517522
return pflag.NormalizedName(name)
518523
default:
519524
err = invalidParameterError("-r", v, "0", "1")

cmd/sqlcmd/sqlcmd_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,49 @@ func TestValidateFlags(t *testing.T) {
246246
}
247247
}
248248

249+
func TestErrorsToStderrDefaultValue(t *testing.T) {
250+
// Test that -r without a value defaults to 0 (ODBC sqlcmd compatibility)
251+
arguments := &SQLCmdArguments{}
252+
cmd := &cobra.Command{
253+
Use: "testCommand",
254+
PreRunE: func(cmd *cobra.Command, argss []string) error {
255+
SetScreenWidthFlags(arguments, cmd)
256+
return nil
257+
},
258+
Run: func(cmd *cobra.Command, argss []string) {
259+
},
260+
SilenceErrors: true,
261+
SilenceUsage: true,
262+
}
263+
setFlags(cmd, arguments)
264+
// Test -r0 explicit
265+
cmd.SetArgs([]string{"-r0"})
266+
err := cmd.Execute()
267+
assert.NoError(t, err, "-r0 should not error")
268+
assert.NotNil(t, arguments.ErrorsToStderr, "ErrorsToStderr should be set")
269+
assert.Equal(t, 0, *arguments.ErrorsToStderr, "-r0 should set value to 0")
270+
271+
// Test -r1 explicit
272+
arguments = &SQLCmdArguments{}
273+
cmd2 := &cobra.Command{
274+
Use: "testCommand",
275+
PreRunE: func(cmd *cobra.Command, argss []string) error {
276+
SetScreenWidthFlags(arguments, cmd)
277+
return nil
278+
},
279+
Run: func(cmd *cobra.Command, argss []string) {
280+
},
281+
SilenceErrors: true,
282+
SilenceUsage: true,
283+
}
284+
setFlags(cmd2, arguments)
285+
cmd2.SetArgs([]string{"-r1"})
286+
err = cmd2.Execute()
287+
assert.NoError(t, err, "-r1 should not error")
288+
assert.NotNil(t, arguments.ErrorsToStderr, "ErrorsToStderr should be set")
289+
assert.Equal(t, 1, *arguments.ErrorsToStderr, "-r1 should set value to 1")
290+
}
291+
249292
// Simulate main() using files
250293
func TestRunInputFiles(t *testing.T) {
251294
o, err := os.CreateTemp("", "sqlcmdmain")

0 commit comments

Comments
 (0)