Skip to content

Commit 89e24e9

Browse files
fix: 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 tests for bare -r flag
1 parent 56b1fb1 commit 89e24e9

2 files changed

Lines changed: 68 additions & 0 deletions

File tree

cmd/sqlcmd/sqlcmd.go

Lines changed: 5 additions & 0 deletions
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

cmd/sqlcmd/sqlcmd_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,69 @@ 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 -r alone (bare flag)
265+
cmd.SetArgs(convertOsArgs([]string{"-r"}))
266+
err := cmd.Execute()
267+
assert.NoError(t, err, "-r should not error")
268+
assert.NotNil(t, arguments.ErrorsToStderr, "ErrorsToStderr should be set when using -r alone")
269+
assert.Equal(t, 0, *arguments.ErrorsToStderr, "-r alone should default to 0")
270+
271+
// Test -r0 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{"-r0"})
286+
err = cmd2.Execute()
287+
assert.NoError(t, err, "-r0 should not error")
288+
assert.NotNil(t, arguments.ErrorsToStderr, "ErrorsToStderr should be set")
289+
assert.Equal(t, 0, *arguments.ErrorsToStderr, "-r0 should set value to 0")
290+
291+
// Test -r1 explicit
292+
arguments = &SQLCmdArguments{}
293+
cmd3 := &cobra.Command{
294+
Use: "testCommand",
295+
PreRunE: func(cmd *cobra.Command, argss []string) error {
296+
SetScreenWidthFlags(arguments, cmd)
297+
return nil
298+
},
299+
Run: func(cmd *cobra.Command, argss []string) {
300+
},
301+
SilenceErrors: true,
302+
SilenceUsage: true,
303+
}
304+
setFlags(cmd3, arguments)
305+
cmd3.SetArgs([]string{"-r1"})
306+
err = cmd3.Execute()
307+
assert.NoError(t, err, "-r1 should not error")
308+
assert.NotNil(t, arguments.ErrorsToStderr, "ErrorsToStderr should be set")
309+
assert.Equal(t, 1, *arguments.ErrorsToStderr, "-r1 should set value to 1")
310+
}
311+
249312
// Simulate main() using files
250313
func TestRunInputFiles(t *testing.T) {
251314
o, err := os.CreateTemp("", "sqlcmdmain")

0 commit comments

Comments
 (0)