From e9f552a03c93ec2e8d0299a745499c80cc15ab37 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Thu, 30 Jun 2022 22:32:05 +0900 Subject: [PATCH] Fix a bug in REPLACE query. ([GitHub #79](https://github.com/mithrandie/csvq/issues/79)) --- lib/query/main_test.go | 1 + lib/query/query_test.go | 51 ++++++++++++++++++++++++++++++++++++ lib/query/view.go | 2 +- testdata/csv/table_empty.csv | 1 + 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 testdata/csv/table_empty.csv diff --git a/lib/query/main_test.go b/lib/query/main_test.go index 9234d44..e8cfc38 100644 --- a/lib/query/main_test.go +++ b/lib/query/main_test.go @@ -145,6 +145,7 @@ func setup() { _ = copyfile(filepath.Join(TestDir, "rename_column.csv"), filepath.Join(TestDataDir, "table1.csv")) _ = copyfile(filepath.Join(TestDir, "updated_file_1.csv"), filepath.Join(TestDataDir, "table1.csv")) _ = copyfile(filepath.Join(TestDir, "dup_name.csv"), filepath.Join(TestDataDir, "dup_name.csv")) + _ = copyfile(filepath.Join(TestDir, "table_empty.csv"), filepath.Join(TestDataDir, "table_empty.csv")) _ = copyfile(filepath.Join(TestDir, "table3.tsv"), filepath.Join(TestDataDir, "table3.tsv")) _ = copyfile(filepath.Join(TestDir, "dup_name.tsv"), filepath.Join(TestDataDir, "dup_name.tsv")) diff --git a/lib/query/query_test.go b/lib/query/query_test.go index 5d0b1d1..e590648 100644 --- a/lib/query/query_test.go +++ b/lib/query/query_test.go @@ -2426,6 +2426,57 @@ var replaceTests = []struct { }, }), }, + { + Name: "Replace Query to Empty Table", + Query: parser.ReplaceQuery{ + Table: parser.Table{Object: parser.Identifier{Literal: "table_empty"}}, + Fields: []parser.QueryExpression{ + parser.FieldReference{Column: parser.Identifier{Literal: "column1"}}, + parser.FieldReference{Column: parser.Identifier{Literal: "column2"}}, + }, + Keys: []parser.QueryExpression{ + parser.FieldReference{Column: parser.Identifier{Literal: "column1"}}, + }, + ValuesList: []parser.QueryExpression{ + parser.RowValue{ + Value: parser.ValueList{ + Values: []parser.QueryExpression{ + parser.NewIntegerValueFromString("4"), + parser.NewStringValue("str4"), + }, + }, + }, + }, + }, + ResultFile: &FileInfo{ + Path: GetTestFilePath("table_empty.csv"), + Delimiter: ',', + NoHeader: false, + Encoding: text.UTF8, + LineBreak: text.LF, + ForUpdate: true, + }, + UpdateCount: 1, + ViewCache: GenerateViewMap([]*View{ + { + FileInfo: &FileInfo{ + Path: GetTestFilePath("table_empty.csv"), + Delimiter: ',', + NoHeader: false, + Encoding: text.UTF8, + LineBreak: text.LF, + ForUpdate: true, + }, + Header: NewHeader("table_empty", []string{"column1", "column2"}), + RecordSet: []Record{ + NewRecord([]value.Primary{ + value.NewInteger(4), + value.NewString("str4"), + }), + }, + }, + }), + }, { Name: "Replace Query For Temporary View", Query: parser.ReplaceQuery{ diff --git a/lib/query/view.go b/lib/query/view.go index f2384db..ee95b5f 100644 --- a/lib/query/view.go +++ b/lib/query/view.go @@ -2222,7 +2222,7 @@ func (view *View) replace(ctx context.Context, flags *cmd.Flags, fields []parser return 0, err } - sortValuesInInsertRecords := make([]SortValues, view.RecordLen()) + sortValuesInInsertRecords := make([]SortValues, len(records)) if err := NewGoroutineTaskManager(len(records), -1, flags.CPU).Run(ctx, func(index int) error { sortValues := make(SortValues, len(keyIndices)) for j, idx := range keyIndices { diff --git a/testdata/csv/table_empty.csv b/testdata/csv/table_empty.csv new file mode 100644 index 0000000..18288ad --- /dev/null +++ b/testdata/csv/table_empty.csv @@ -0,0 +1 @@ +column1,column2