|
7 | 7 | "bytes" |
8 | 8 | "database/sql" |
9 | 9 | "fmt" |
| 10 | + "io" |
10 | 11 | "os" |
11 | 12 | "os/user" |
12 | 13 | "strings" |
@@ -240,6 +241,76 @@ func TestExitInitialQuery(t *testing.T) { |
240 | 241 |
|
241 | 242 | } |
242 | 243 |
|
| 244 | +func TestExitCodeSetOnError(t *testing.T) { |
| 245 | + s, _ := setupSqlCmdWithMemoryOutput(t) |
| 246 | + s.Connect.ErrorSeverityLevel = 12 |
| 247 | + retcode, err := s.runQuery("RAISERROR (N'Testing!' , 11, 1)") |
| 248 | + assert.NoError(t, err, "!ExitOnError 11") |
| 249 | + assert.Equal(t, -101, retcode, "Raiserror below ErrorSeverityLevel") |
| 250 | + retcode, err = s.runQuery("RAISERROR (N'Testing!' , 14, 1)") |
| 251 | + assert.NoError(t, err, "!ExitOnError 14") |
| 252 | + assert.Equal(t, 14, retcode, "Raiserror above ErrorSeverityLevel") |
| 253 | + s.Connect.ExitOnError = true |
| 254 | + retcode, err = s.runQuery("RAISERROR (N'Testing!' , 11, 1)") |
| 255 | + assert.NoError(t, err, "ExitOnError and Raiserror below ErrorSeverityLevel") |
| 256 | + assert.Equal(t, -101, retcode, "Raiserror below ErrorSeverityLevel") |
| 257 | + retcode, err = s.runQuery("RAISERROR (N'Testing!' , 14, 1)") |
| 258 | + assert.ErrorIs(t, err, ErrExitRequested, "ExitOnError and Raiserror above ErrorSeverityLevel") |
| 259 | + assert.Equal(t, 14, retcode, "ExitOnError and Raiserror above ErrorSeverityLevel") |
| 260 | + s.Connect.ErrorSeverityLevel = 0 |
| 261 | + retcode, err = s.runQuery("RAISERROR (N'Testing!' , 11, 1)") |
| 262 | + assert.ErrorIs(t, err, ErrExitRequested, "ExitOnError and ErrorSeverityLevel = 0, Raiserror above 10") |
| 263 | + assert.Equal(t, 1, retcode, "ExitOnError and ErrorSeverityLevel = 0, Raiserror above 10") |
| 264 | + retcode, err = s.runQuery("RAISERROR (N'Testing!' , 5, 1)") |
| 265 | + assert.NoError(t, err, "ExitOnError and ErrorSeverityLevel = 0, Raiserror below 10") |
| 266 | + assert.Equal(t, -101, retcode, "ExitOnError and ErrorSeverityLevel = 0, Raiserror below 10") |
| 267 | +} |
| 268 | + |
| 269 | +func TestSqlCmdExitOnError(t *testing.T) { |
| 270 | + s, buf := setupSqlCmdWithMemoryOutput(t) |
| 271 | + s.Connect.ExitOnError = true |
| 272 | + err := runSqlCmd(t, s, []string{"select 1", "GO", ":setvar", "select 2", "GO"}) |
| 273 | + o := buf.buf.String() |
| 274 | + assert.EqualError(t, err, "Sqlcmd: Error: Syntax error at line 3 near command ':SETVAR'.", "Run should return an error") |
| 275 | + assert.Equal(t, "1"+SqlcmdEol+SqlcmdEol+oneRowAffected+SqlcmdEol, o, "Only first select should run") |
| 276 | + assert.Equal(t, 1, s.Exitcode, "s.ExitCode for a syntax error") |
| 277 | + |
| 278 | + s, buf = setupSqlCmdWithMemoryOutput(t) |
| 279 | + s.Connect.ExitOnError = true |
| 280 | + s.Connect.ErrorSeverityLevel = 15 |
| 281 | + s.vars.Set(SQLCMDERRORLEVEL, "14") |
| 282 | + err = runSqlCmd(t, s, []string{"raiserror(N'13', 13, 1)", "GO", "raiserror(N'14', 14, 1)", "GO", "raiserror(N'15', 15, 1)", "GO", "SELECT 'nope'", "GO"}) |
| 283 | + o = buf.buf.String() |
| 284 | + assert.NotContains(t, o, "Level 13", "Level 13 should be filtered from the output") |
| 285 | + assert.NotContains(t, o, "nope", "Last select should not be run") |
| 286 | + assert.Contains(t, o, "Level 14", "Level 14 should be in the output") |
| 287 | + assert.Contains(t, o, "Level 15", "Level 15 should be in the output") |
| 288 | + assert.Equal(t, 15, s.Exitcode, "s.ExitCode for a syntax error") |
| 289 | + assert.NoError(t, err, "Run should not return an error for a SQL error") |
| 290 | +} |
| 291 | + |
| 292 | +func TestSqlCmdSetErrorLevel(t *testing.T) { |
| 293 | + s, _ := setupSqlCmdWithMemoryOutput(t) |
| 294 | + s.Connect.ErrorSeverityLevel = 15 |
| 295 | + err := runSqlCmd(t, s, []string{"select bad as bad", "GO", "select 1", "GO"}) |
| 296 | + assert.NoError(t, err, "runSqlCmd should have no error") |
| 297 | + assert.Equal(t, 16, s.Exitcode, "Select error should be the exit code") |
| 298 | +} |
| 299 | + |
| 300 | +func runSqlCmd(t testing.TB, s *Sqlcmd, lines []string) error { |
| 301 | + t.Helper() |
| 302 | + i := 0 |
| 303 | + s.batch.read = func() (string, error) { |
| 304 | + if i < len(lines) { |
| 305 | + index := i |
| 306 | + i++ |
| 307 | + return lines[index], nil |
| 308 | + } |
| 309 | + return "", io.EOF |
| 310 | + } |
| 311 | + return s.Run(false, false) |
| 312 | +} |
| 313 | + |
243 | 314 | func setupSqlCmdWithMemoryOutput(t testing.TB) (*Sqlcmd, *memoryBuffer) { |
244 | 315 | v := InitializeVariables(true) |
245 | 316 | v.Set(SQLCMDMAXVARTYPEWIDTH, "0") |
|
0 commit comments