From b18b6c966a32e1b40d1a158a650bad77e55d925c Mon Sep 17 00:00:00 2001 From: gleb Date: Tue, 13 Apr 2021 09:26:20 +0300 Subject: [PATCH 1/5] skip not string --- rows.go | 13 +++++++++---- rows_test.go | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/rows.go b/rows.go index 5268254..882e502 100644 --- a/rows.go +++ b/rows.go @@ -84,10 +84,12 @@ func (r *textRows) Next(dest []driver.Value) error { // skip row before WITH TOTALS, // not but do not skip an empty line if it is part of the result - if len(row) == 1 && row[0] == "" && len(dest) != 1 { - row, err = r.tsv.Read() - if err != nil { - return err + var canSkip bool + if len(row) == 1 && row[0] == "" { + if len(dest) == 1 { + canSkip = true + } else { + return r.Next(dest) } } @@ -95,6 +97,9 @@ func (r *textRows) Next(dest []driver.Value) error { reader := strings.NewReader(s) v, err := r.parsers[i].Parse(reader) if err != nil { + if canSkip { + return r.Next(dest) + } return err } if _, _, err := reader.ReadRune(); err != io.EOF { diff --git a/rows_test.go b/rows_test.go index df7acec..e860254 100644 --- a/rows_test.go +++ b/rows_test.go @@ -131,3 +131,18 @@ func TestTextRowsWithEmptyLine(t *testing.T) { } assert.Equal(t, []driver.Value{int32(2), ""}, dest) } + +func TestInt32RowsEmpty(t *testing.T) { + buf := bytes.NewReader([]byte("text\nInt64\n\n1\n")) + rows, err := newTextRows(&conn{}, &bufReadCloser{buf}, time.Local, false) + if !assert.NoError(t, err) { + return + } + assert.Equal(t, []string{"text"}, rows.Columns()) + assert.Equal(t, []string{"Int64"}, rows.types) + dest := make([]driver.Value, 1) + if !assert.NoError(t, rows.Next(dest)) { + return + } + assert.Equal(t, []driver.Value{int64(1)}, dest) +} From eaceaff414918bb0fa6568638da56202f17a6e84 Mon Sep 17 00:00:00 2001 From: gleb Date: Tue, 13 Apr 2021 10:59:02 +0300 Subject: [PATCH 2/5] skip not string --- rows.go | 13 ++++--------- rows_test.go | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/rows.go b/rows.go index 882e502..7189725 100644 --- a/rows.go +++ b/rows.go @@ -84,12 +84,10 @@ func (r *textRows) Next(dest []driver.Value) error { // skip row before WITH TOTALS, // not but do not skip an empty line if it is part of the result - var canSkip bool - if len(row) == 1 && row[0] == "" { - if len(dest) == 1 { - canSkip = true - } else { - return r.Next(dest) + if len(row) == 1 && row[0] == "" && (len(dest) != 1 || r.ColumnTypeDatabaseTypeName(0) != "String") { + row, err = r.tsv.Read() + if err != nil { + return err } } @@ -97,9 +95,6 @@ func (r *textRows) Next(dest []driver.Value) error { reader := strings.NewReader(s) v, err := r.parsers[i].Parse(reader) if err != nil { - if canSkip { - return r.Next(dest) - } return err } if _, _, err := reader.ReadRune(); err != io.EOF { diff --git a/rows_test.go b/rows_test.go index e860254..d11534f 100644 --- a/rows_test.go +++ b/rows_test.go @@ -146,3 +146,18 @@ func TestInt32RowsEmpty(t *testing.T) { } assert.Equal(t, []driver.Value{int64(1)}, dest) } + +func TestFloat64RowsEmpty(t *testing.T) { + buf := bytes.NewReader([]byte("text\nFloat64\n\n1.0\n")) + rows, err := newTextRows(&conn{}, &bufReadCloser{buf}, time.Local, false) + if !assert.NoError(t, err) { + return + } + assert.Equal(t, []string{"text"}, rows.Columns()) + assert.Equal(t, []string{"Float64"}, rows.types) + dest := make([]driver.Value, 1) + if !assert.NoError(t, rows.Next(dest)) { + return + } + assert.Equal(t, []driver.Value{float64(1)}, dest) +} From f6ae24a8eb0477476798b2c27b257bf703df010e Mon Sep 17 00:00:00 2001 From: glebvk85 Date: Thu, 15 Apr 2021 14:28:13 +0300 Subject: [PATCH 3/5] skip all not String --- rows.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rows.go b/rows.go index 7189725..fce8376 100644 --- a/rows.go +++ b/rows.go @@ -84,7 +84,7 @@ func (r *textRows) Next(dest []driver.Value) error { // skip row before WITH TOTALS, // not but do not skip an empty line if it is part of the result - if len(row) == 1 && row[0] == "" && (len(dest) != 1 || r.ColumnTypeDatabaseTypeName(0) != "String") { + if len(row) == 1 && row[0] == "" && (len(dest) != 1 || !strings.Contains(r.ColumnTypeDatabaseTypeName(0), "String")) { row, err = r.tsv.Read() if err != nil { return err From b91d47370a322d92f918ac4c3295dbbebf656ab8 Mon Sep 17 00:00:00 2001 From: glebvk85 Date: Fri, 16 Apr 2021 09:07:37 +0300 Subject: [PATCH 4/5] Update rows.go --- rows.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rows.go b/rows.go index fce8376..94eb036 100644 --- a/rows.go +++ b/rows.go @@ -84,7 +84,7 @@ func (r *textRows) Next(dest []driver.Value) error { // skip row before WITH TOTALS, // not but do not skip an empty line if it is part of the result - if len(row) == 1 && row[0] == "" && (len(dest) != 1 || !strings.Contains(r.ColumnTypeDatabaseTypeName(0), "String")) { + if len(row) == 1 && row[0] == "" { row, err = r.tsv.Read() if err != nil { return err From 08fcc6e4fbe920cf0fa200fd112133eddddb0804 Mon Sep 17 00:00:00 2001 From: glebvk85 Date: Mon, 19 Apr 2021 19:28:12 +0300 Subject: [PATCH 5/5] Update rows_test.go --- rows_test.go | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/rows_test.go b/rows_test.go index ca3f397..d514308 100644 --- a/rows_test.go +++ b/rows_test.go @@ -83,21 +83,6 @@ func TestTextRowsNewLine(t *testing.T) { assert.Equal(t, []driver.Value{"Hello\nThere"}, dest) } -func TestTextRowsEmpty(t *testing.T) { - buf := bytes.NewReader([]byte("text\nString\n\n")) - rows, err := newTextRows(&conn{}, &bufReadCloser{buf}, time.Local, false) - if !assert.NoError(t, err) { - return - } - assert.Equal(t, []string{"text"}, rows.Columns()) - assert.Equal(t, []string{"String"}, rows.types) - dest := make([]driver.Value, 1) - if !assert.NoError(t, rows.Next(dest)) { - return - } - assert.Equal(t, []driver.Value{""}, dest) -} - func TestTextRowsWithStartsDoubleQuotes(t *testing.T) { buf := bytes.NewReader([]byte("text\nString\n\"\n")) rows, err := newTextRows(&conn{}, &bufReadCloser{buf}, time.Local, false)