diff --git a/go/cmd/dolt/commands/sql.go b/go/cmd/dolt/commands/sql.go index 921483d7a01..1d75bbc2020 100644 --- a/go/cmd/dolt/commands/sql.go +++ b/go/cmd/dolt/commands/sql.go @@ -841,7 +841,9 @@ func execShell(sqlCtx *sql.Context, qryist cli.Queryist, format engine.PrintResu sqlStmt, err := sqlparser.Parse(query) // silently skip empty statements if err == nil || err == sqlparser.ErrEmpty { - sqlSch, rowIter, _, err := processParsedQuery(sqlCtx, query, qryist, sqlStmt) + var sqlSch sql.Schema + var rowIter sql.RowIter + sqlSch, rowIter, _, err = processParsedQuery(sqlCtx, query, qryist, sqlStmt) if err != nil { verr := formatQueryError("", err) shell.Println(verr.Verbose()) @@ -852,13 +854,16 @@ func execShell(sqlCtx *sql.Context, qryist cli.Queryist, format engine.PrintResu default: err = engine.PrettyPrintResults(sqlCtx, closureFormat, sqlSch, rowIter, pagerEnabled, toggleWarnings, true, binaryAsHex) } + if err != nil { + verr := formatQueryError("", err) + shell.Println(verr.Verbose()) + } } else { if _, isUseStmt := sqlStmt.(*sqlparser.Use); isUseStmt { cli.Println("Database Changed") } } - } - if err != nil { + } else { shell.Println(color.RedString(err.Error())) } } diff --git a/integration-tests/bats/sql-shell-error.expect b/integration-tests/bats/sql-shell-error.expect new file mode 100755 index 00000000000..46d04f87198 --- /dev/null +++ b/integration-tests/bats/sql-shell-error.expect @@ -0,0 +1,17 @@ +#!/usr/bin/expect + +set timeout 5 +set env(NO_COLOR) 1 + +source "$env(BATS_CWD)/helper/common_expect_functions.tcl" + +spawn dolt sql + +expect_with_defaults {dolt-repo-[0-9]+/main\*> } { send "SELECT DOES_NOT_EXIST();\r" } + +expect_with_defaults_2 "function: 'does_not_exist' not found\r" {dolt-repo-[0-9]+/main\*> } { send "SELECT JSON_PRETTY(\"INVALID\");\r" } + +expect_with_defaults_2 "Invalid JSON text in argument 1 to function json_pretty: \"INVALID\"\r" {dolt-repo-[0-9]+/main\*> } { send "quit\r" } + +expect eof +exit diff --git a/integration-tests/bats/sql-shell.bats b/integration-tests/bats/sql-shell.bats index e14534c3816..f047e20e207 100644 --- a/integration-tests/bats/sql-shell.bats +++ b/integration-tests/bats/sql-shell.bats @@ -31,6 +31,16 @@ teardown() { [ "$status" -eq 0 ] } +# bats test_tags=no_lambda +@test "sql-shell: Query errors are printed in interactive shell" { + skiponwindows "Need to install expect and make this script work on windows." + if [ "$SQL_ENGINE" = "remote-engine" ]; then + skip "shell on server returns Empty Set instead of OkResult" + fi + run $BATS_TEST_DIRNAME/sql-shell-error.expect + [ "$status" -eq 0 ] +} + # bats test_tags=no_lambda @test "sql-shell: database changed is printed in interactive shell" { skiponwindows "Need to install expect and make this script work on windows."