From e46bbab958c0dadc6a33d14addd326a2fe24683a Mon Sep 17 00:00:00 2001 From: David Shiflet Date: Mon, 4 Apr 2022 16:05:12 -0400 Subject: [PATCH 1/2] add test for persistent connection --- pkg/sqlcmd/sqlcmd_test.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkg/sqlcmd/sqlcmd_test.go b/pkg/sqlcmd/sqlcmd_test.go index f2666fa7..17d1e42a 100644 --- a/pkg/sqlcmd/sqlcmd_test.go +++ b/pkg/sqlcmd/sqlcmd_test.go @@ -408,6 +408,16 @@ func TestSqlCmdDefersToPrintError(t *testing.T) { } } +func TestSqlCmdMaintainsConnectionBetweenBatches(t *testing.T) { + s, buf := setupSqlCmdWithMemoryOutput(t) + defer buf.Close() + err := runSqlCmd(t, s, []string{"CREATE TABLE #tmp1 (col1 int)", "insert into #tmp1 values (1)", "GO", "select * from #tmp1", "drop table #tmp1", "GO"}) + if assert.NoError(t, err, "runSqlCmd failed") { + assert.Equal(t, "1"+SqlcmdEol+oneRowAffected+SqlcmdEol, buf.buf.String(), "Errors should be filtered by s.PrintError") + } + +} + // runSqlCmd uses lines as input for sqlcmd instead of relying on file or console input func runSqlCmd(t testing.TB, s *Sqlcmd, lines []string) error { t.Helper() From 601024fb32e98a01cc1ac1d987b4fc22ca19660f Mon Sep 17 00:00:00 2001 From: David Shiflet Date: Mon, 4 Apr 2022 16:28:05 -0400 Subject: [PATCH 2/2] keep single connection open --- pkg/sqlcmd/format_test.go | 3 ++- pkg/sqlcmd/sqlcmd.go | 5 ++--- pkg/sqlcmd/sqlcmd_test.go | 5 ++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/pkg/sqlcmd/format_test.go b/pkg/sqlcmd/format_test.go index 0ba31670..39224500 100644 --- a/pkg/sqlcmd/format_test.go +++ b/pkg/sqlcmd/format_test.go @@ -4,6 +4,7 @@ package sqlcmd import ( + "context" "strings" "testing" @@ -62,7 +63,7 @@ func TestCalcColumnDetails(t *testing.T) { if assert.NoError(t, err, "ConnectDB failed") { defer db.Close() for x, test := range tests { - rows, err := db.Query(test.query) + rows, err := db.QueryContext(context.Background(), test.query) if assert.NoError(t, err, "Query failed: %s", test.query) { defer rows.Close() cols, err := rows.ColumnTypes() diff --git a/pkg/sqlcmd/sqlcmd.go b/pkg/sqlcmd/sqlcmd.go index ccbdb499..9f42540d 100644 --- a/pkg/sqlcmd/sqlcmd.go +++ b/pkg/sqlcmd/sqlcmd.go @@ -50,7 +50,7 @@ type Console interface { type Sqlcmd struct { lineIo Console workingDirectory string - db *sql.DB + db *sql.Conn out io.WriteCloser err io.WriteCloser batch *Batch @@ -232,8 +232,7 @@ func (s *Sqlcmd) ConnectDb(connect *ConnectSettings, nopw bool) error { if err != nil { return err } - db := sql.OpenDB(connector) - err = db.Ping() + db, err := sql.OpenDB(connector).Conn(context.Background()) if err != nil { fmt.Fprintln(s.GetOutput(), err) return err diff --git a/pkg/sqlcmd/sqlcmd_test.go b/pkg/sqlcmd/sqlcmd_test.go index 17d1e42a..7014f336 100644 --- a/pkg/sqlcmd/sqlcmd_test.go +++ b/pkg/sqlcmd/sqlcmd_test.go @@ -87,7 +87,7 @@ func TestSqlCmdConnectDb(t *testing.T) { } } -func ConnectDb(t testing.TB) (*sql.DB, error) { +func ConnectDb(t testing.TB) (*sql.Conn, error) { v := InitializeVariables(true) s := &Sqlcmd{vars: v} s.Connect = newConnect(t) @@ -413,9 +413,8 @@ func TestSqlCmdMaintainsConnectionBetweenBatches(t *testing.T) { defer buf.Close() err := runSqlCmd(t, s, []string{"CREATE TABLE #tmp1 (col1 int)", "insert into #tmp1 values (1)", "GO", "select * from #tmp1", "drop table #tmp1", "GO"}) if assert.NoError(t, err, "runSqlCmd failed") { - assert.Equal(t, "1"+SqlcmdEol+oneRowAffected+SqlcmdEol, buf.buf.String(), "Errors should be filtered by s.PrintError") + assert.Equal(t, oneRowAffected+SqlcmdEol+"1"+SqlcmdEol+SqlcmdEol+oneRowAffected+SqlcmdEol, buf.buf.String(), "Sqlcmd uses the same connection for all queries") } - } // runSqlCmd uses lines as input for sqlcmd instead of relying on file or console input