From 9767765c9e145c08f7100356b37f4acbbf425684 Mon Sep 17 00:00:00 2001 From: Oleg Matrokhin Date: Tue, 13 Nov 2018 18:20:01 +0300 Subject: [PATCH 1/2] add flag to regexp for multiline queries --- stmt.go | 2 +- stmt_test.go | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/stmt.go b/stmt.go index bc0934f..c342b69 100644 --- a/stmt.go +++ b/stmt.go @@ -10,7 +10,7 @@ import ( ) var ( - splitInsertRe = regexp.MustCompile(`(.+\s+VALUES)\s*(\(.+\))`) + splitInsertRe = regexp.MustCompile(`(?s)(.+\s+VALUES)\s*(\(.+\))`) ) type stmt struct { diff --git a/stmt_test.go b/stmt_test.go index bfefa79..5793d12 100644 --- a/stmt_test.go +++ b/stmt_test.go @@ -194,6 +194,18 @@ func (s *stmtSuite) TestFixDoubleInterpolateInStmt() { s.NoError(rows.Close()) } +func (s *stmtSuite) TestFixMultiLineInsert() { + q := ` +INSERT INTO tbl ( +a +) VALUES ( +? +) +` + st := newStmt(q) + s.True(st.batchMode) +} + func TestStmt(t *testing.T) { suite.Run(t, new(stmtSuite)) } From 8257e82d84a42c55baf81655ff53aa14648391bd Mon Sep 17 00:00:00 2001 From: Oleg Matrokhin Date: Mon, 19 Nov 2018 18:53:38 +0300 Subject: [PATCH 2/2] add testcase --- stmt_test.go | 65 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 19 deletions(-) diff --git a/stmt_test.go b/stmt_test.go index 5793d12..80ffafb 100644 --- a/stmt_test.go +++ b/stmt_test.go @@ -113,25 +113,52 @@ func (s *stmtSuite) TestExec() { } func (s *stmtSuite) TestExecMulti() { - require := s.Require() - tx, err := s.conn.Begin() - require.NoError(err) - st, err := tx.Prepare("INSERT INTO data (i64) VALUES (?)") - require.NoError(err) - st.Exec(21) - st.Exec(22) - rows, err := s.conn.Query("SELECT i64 FROM data WHERE i64=21") - s.False(rows.Next()) - s.NoError(rows.Close()) - require.NoError(tx.Commit()) - s.NoError(st.Close()) - rows, err = s.conn.Query("SELECT i64 FROM data WHERE i64>20") - require.NoError(err) - expected := [][]interface{}{{int64(21)}, {int64(22)}} - v, err := scanValues(rows, expected[0]) - s.NoError(rows.Close()) - require.NoError(err) - s.Equal(expected, v) + testCases := []struct { + insertQuery string + exec1 int64 + exec2 int64 + query1 string + query2 string + expected [][]interface{} + }{ + { + "INSERT INTO data (i64) VALUES (?)", + 21, + 22, + "SELECT i64 FROM data WHERE i64=21", + "SELECT i64 FROM data WHERE i64>20", + [][]interface{}{{int64(21)}, {int64(22)}}, + }, + { + "INSERT\nINTO\ndata\n(\ni64\n)\nVALUES\n(\n?\n)", + 23, + 24, + "SELECT i64 FROM data WHERE i64=23", + "SELECT i64 FROM data WHERE i64>22", + [][]interface{}{{int64(23)}, {int64(24)}}, + }, + } + + for _, tc := range testCases { + require := s.Require() + tx, err := s.conn.Begin() + require.NoError(err) + st, err := tx.Prepare(tc.insertQuery) + require.NoError(err) + st.Exec(tc.exec1) + st.Exec(tc.exec2) + rows, err := s.conn.Query(tc.query1) + s.False(rows.Next()) + s.NoError(rows.Close()) + require.NoError(tx.Commit()) + s.NoError(st.Close()) + rows, err = s.conn.Query(tc.query2) + require.NoError(err) + v, err := scanValues(rows, tc.expected[0]) + s.NoError(rows.Close()) + require.NoError(err) + s.Equal(tc.expected, v) + } } func (s *stmtSuite) TestExecMultiRollback() {