diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 796deed..3033898 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,11 +24,13 @@ repos: language: golang entry: goimports files: \.go$ + additional_dependencies: + - golang.org/x/tools/cmd/goimports@latest args: - -w require_serial: true - repo: https://github.com/golangci/golangci-lint - rev: v1.59.1 + rev: v2.7.2 hooks: - id: golangci-lint exclude: ^pkg/ diff --git a/.vscode/settings.json b/.vscode/settings.json index da7b87d..41e7209 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,5 +5,6 @@ "go.lintTool": "golangci-lint", "go.lintFlags": [ "--fast" - ] + ], + "go.testTimeout": "600s" } diff --git a/chunk.go b/chunk.go index 0f72878..38657ad 100644 --- a/chunk.go +++ b/chunk.go @@ -23,6 +23,7 @@ import ( "io" "net" "strconv" + "strings" "time" "github.com/pierrec/lz4" @@ -363,6 +364,8 @@ func (this *SQCloud) sendArray(command string, values []interface{}) (int, error } } + command = strings.Trim(command, " \t\r\n") + // convert values to buffers encoded with whe sqlitecloud protocol buffers := [][]byte{protocolBufferFromString(command, true)[0]} for _, v := range values { diff --git a/test/compress_test.go b/test/compress_test.go index 1b26fb6..71adb43 100644 --- a/test/compress_test.go +++ b/test/compress_test.go @@ -127,3 +127,24 @@ func TestCompress(t *testing.T) { t.Fatal(err.Error()) } } + +func TestRowsetChunkCompressed(t *testing.T) { + var db *sqlitecloud.SQCloud + var err error + + connectionString, _ := os.LookupEnv("SQLITE_CONNECTION_STRING") + apikey, _ := os.LookupEnv("SQLITE_API_KEY") + if db, err = sqlitecloud.Connect(connectionString + "?apikey=" + apikey); err != nil { + t.Fatal("CONNECT: ", err.Error()) + } + defer db.Close() + + switch res, err := db.Select("TEST ROWSET_CHUNK_COMPRESSED"); { // ROWSET + case err != nil: + t.Fatal("TEST ROWSET_CHUNK_COMPRESSED: ", err.Error()) + case res == nil: + t.Fatal("TEST ROWSET_CHUNK_COMPRESSED: nil result") + case !res.IsRowSet(): + t.Fatal("TEST ROWSET_CHUNK_COMPRESSED: invalid type") + } +} diff --git a/test/selectarray_test.go b/test/selectarray_test.go index fee27ca..50e8ac4 100644 --- a/test/selectarray_test.go +++ b/test/selectarray_test.go @@ -141,3 +141,71 @@ func TestSelectArrayTableNameWithQuotes(t *testing.T) { t.Fatal(err.Error()) } } + +func TestSelectArrayWithLeadingChars(t *testing.T) { + // Server API test + connectionString, _ := os.LookupEnv("SQLITE_CONNECTION_STRING") + apikey, _ := os.LookupEnv("SQLITE_API_KEY") + connectionString += "/" + os.Getenv("SQLITE_DB") + "?apikey=" + apikey + + config, err1 := sqlitecloud.ParseConnectionString(connectionString) + if err1 != nil { + t.Fatal(err1.Error()) + } + + db := sqlitecloud.New(*config) + err := db.Connect() + + if err != nil { + t.Fatalf(err.Error()) + } + + defer db.Close() + + // test select with leading spaces + result, err := db.SelectArray(" SELECT 1 AS value;", nil) + if err != nil { + t.Fatal(err.Error()) + } + if result.GetNumberOfRows() != 1 { + t.Fatalf("Expected 1 row, got %d rows", result.GetNumberOfRows()) + } + + // test select with leading tabs + result, err = db.SelectArray("\t\t\tSELECT 1 AS value;", nil) + if err != nil { + t.Fatal(err.Error()) + } + if result.GetNumberOfRows() != 1 { + t.Fatalf("Expected 1 row, got %d rows", result.GetNumberOfRows()) + } + + // test select with leading new lines + result, err = db.SelectArray("\n\n\nSELECT 1 AS value;", nil) + if err != nil { + t.Fatal(err.Error()) + } + if result.GetNumberOfRows() != 1 { + t.Fatalf("Expected 1 row, got %d rows", result.GetNumberOfRows()) + } + + // test with leading carriage returns + result, err = db.SelectArray("\r\r\rSELECT 1 AS value;", nil) + if err != nil { + t.Fatal(err.Error()) + } + if result.GetNumberOfRows() != 1 { + t.Fatalf("Expected 1 row, got %d rows", result.GetNumberOfRows()) + } + + // test select with mixed leading characters + result, err = db.SelectArray(` + SELECT 1 AS value; + `, nil) + if err != nil { + t.Fatal(err.Error()) + } + if result.GetNumberOfRows() != 1 { + t.Fatalf("Expected 1 row, got %d rows", result.GetNumberOfRows()) + } +}