Skip to content

Commit 26a1ded

Browse files
committed
Updated tests
1 parent 3cac808 commit 26a1ded

15 files changed

Lines changed: 402 additions & 1947 deletions

Makefile

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
test: test_mssql test_pgsql
2-
1+
test: test_mssql
32

43
test_mssql:
5-
docker compose --progress plain -f docker-compose.mssql.yml run test
6-
7-
test_pgsql:
8-
docker compose --progress plain -f docker-compose.pgsql.yml run test
4+
docker compose --progress plain -f docker-compose.mssql.yml run test

docker-compose.pgsql.yml

Lines changed: 0 additions & 27 deletions
This file was deleted.

preprocess.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"regexp"
1111
"strings"
1212

13-
"github.com/jackc/pgx/v5/stdlib"
1413
"github.com/vippsas/sqlcode/sqlparser"
1514
"github.com/vippsas/sqlcode/sqlparser/sqldocument"
1615
)
@@ -115,6 +114,8 @@ func sqlcodeTransformCreate(declares map[string]string, c sqldocument.Create, qu
115114
// A @Enum replacement can lead to line numbers changing due to \n present in the literal.
116115
// For this reason we need to make a mapping between source line numbers and result
117116
// line numbers
117+
//
118+
// TODO: The sqldocument should be responsible for transforming itself, not this function.
118119
for _, u := range c.Body {
119120
token := u.RawValue
120121
switch {
@@ -160,11 +161,6 @@ func Preprocess(doc sqldocument.Document, schemasuffix string, driver driver.Dri
160161
// the default target for mssql
161162
target := fmt.Sprintf(`[code@%s]`, schemasuffix)
162163

163-
// pgsql target
164-
if _, ok := driver.(*stdlib.Driver); ok {
165-
target = fmt.Sprintf(`"code@%s"`, schemasuffix)
166-
}
167-
168164
for _, create := range doc.Creates() {
169165
if len(create.Body) == 0 {
170166
continue

preprocess_test.go

Lines changed: 23 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,20 @@ import (
44
"strings"
55
"testing"
66

7-
"github.com/jackc/pgx/v5/stdlib"
87
mssql "github.com/microsoft/go-mssqldb"
98
"github.com/stretchr/testify/assert"
109
"github.com/stretchr/testify/require"
1110
"github.com/vippsas/sqlcode/sqlparser"
11+
mssql17 "github.com/vippsas/sqlcode/sqlparser/mssql"
12+
"github.com/vippsas/sqlcode/sqlparser/sqldocument"
1213
)
1314

15+
func ParseString(t *testing.T, file, input string) *mssql17.TSqlDocument {
16+
d := &mssql17.TSqlDocument{}
17+
assert.NoError(t, d.Parse([]byte(input), sqldocument.FileRef(file)))
18+
return d
19+
}
20+
1421
func TestLineNumberInInput(t *testing.T) {
1522

1623
// Scenario:
@@ -64,7 +71,7 @@ func TestSchemaSuffixFromHash(t *testing.T) {
6471
})
6572

6673
t.Run("returns consistent hash", func(t *testing.T) {
67-
doc := sqlparser.ParseString("test.sql", `
74+
doc := ParseString(t, "test.sql", `
6875
declare @EnumFoo int = 1;
6976
go
7077
create procedure [code].Test as begin end
@@ -78,12 +85,12 @@ create procedure [code].Test as begin end
7885
})
7986

8087
t.Run("different content yields different hash", func(t *testing.T) {
81-
doc1 := sqlparser.ParseString("test.sql", `
88+
doc1 := ParseString(t, "test.sql", `
8289
declare @EnumFoo int = 1;
8390
go
8491
create procedure [code].Test1 as begin end
8592
`)
86-
doc2 := sqlparser.ParseString("test.sql", `
93+
doc2 := ParseString(t, "test.sql", `
8794
declare @EnumFoo int = 2;
8895
go
8996
create procedure [code].Test2 as begin end
@@ -94,12 +101,6 @@ create procedure [code].Test2 as begin end
94101

95102
assert.NotEqual(t, suffix1, suffix2)
96103
})
97-
98-
t.Run("empty document has hash", func(t *testing.T) {
99-
doc := sqlparser.NewDocumentFromExtension(".pgsql")
100-
suffix := SchemaSuffixFromHash(doc)
101-
assert.Len(t, suffix, 12)
102-
})
103104
}
104105

105106
func TestSchemaName(t *testing.T) {
@@ -110,7 +111,7 @@ func TestSchemaName(t *testing.T) {
110111
func TestBatchLineNumberInInput(t *testing.T) {
111112
t.Run("no corrections", func(t *testing.T) {
112113
b := Batch{
113-
StartPos: sqlparser.Pos{Line: 10, Col: 1},
114+
StartPos: sqldocument.Pos{Line: 10, Col: 1},
114115
Lines: "line1\nline2\nline3",
115116
}
116117

@@ -121,7 +122,7 @@ func TestBatchLineNumberInInput(t *testing.T) {
121122

122123
t.Run("with corrections", func(t *testing.T) {
123124
b := Batch{
124-
StartPos: sqlparser.Pos{Line: 10, Col: 1},
125+
StartPos: sqldocument.Pos{Line: 10, Col: 1},
125126
Lines: "line1\nline2\nextra1\nextra2\nline3",
126127
lineNumberCorrections: []lineNumberCorrection{
127128
{inputLineNumber: 2, extraLinesInOutput: 2}, // line 2 became 3 lines
@@ -184,7 +185,7 @@ func TestBatchRelativeLineNumberInInput(t *testing.T) {
184185

185186
func TestPreprocess(t *testing.T) {
186187
t.Run("basic procedure with schema replacement", func(t *testing.T) {
187-
doc := sqlparser.ParseString("test.sql", `
188+
doc := ParseString(t, "test.sql", `
188189
create procedure [code].Test as
189190
begin
190191
select 1
@@ -199,24 +200,8 @@ end
199200
assert.NotContains(t, result.Batches[0].Lines, "[code].")
200201
})
201202

202-
t.Run("postgres uses unquoted schema name", func(t *testing.T) {
203-
doc := sqlparser.ParseString("test.pgsql", `
204-
create procedure [code].test() as $$
205-
begin
206-
perform 1;
207-
end;
208-
$$ language plpgsql;
209-
`)
210-
result, err := Preprocess(doc, "abc123", &stdlib.Driver{})
211-
require.NoError(t, err)
212-
require.Len(t, result.Batches, 1)
213-
214-
assert.Contains(t, result.Batches[0].Lines, `"code@abc123".`)
215-
assert.NotContains(t, result.Batches[0].Lines, "[code@abc123].")
216-
})
217-
218203
t.Run("replaces enum constants", func(t *testing.T) {
219-
doc := sqlparser.ParseString("test.sql", `
204+
doc := ParseString(t, "test.sql", `
220205
declare @EnumStatus int = 42;
221206
go
222207
create procedure [code].Test as
@@ -234,7 +219,7 @@ end
234219
})
235220

236221
t.Run("handles multiline string constants", func(t *testing.T) {
237-
doc := sqlparser.ParseString("test.sql", `
222+
doc := ParseString(t, "test.sql", `
238223
declare @EnumMulti nvarchar(max) = N'line1
239224
line2
240225
line3';
@@ -256,7 +241,7 @@ end
256241
})
257242

258243
t.Run("error on undeclared constant", func(t *testing.T) {
259-
doc := sqlparser.ParseString("test.sql", `
244+
doc := ParseString(t, "test.sql", `
260245
create procedure [code].Test as
261246
begin
262247
select @EnumUndeclared
@@ -272,7 +257,7 @@ end
272257
})
273258

274259
t.Run("error on schema suffix with bracket", func(t *testing.T) {
275-
doc := sqlparser.ParseString("test.sql", `
260+
doc := ParseString(t, "test.sql", `
276261
create procedure [code].Test as begin end
277262
`)
278263
_, err := Preprocess(doc, "abc]123", &mssql.Driver{})
@@ -281,7 +266,7 @@ create procedure [code].Test as begin end
281266
})
282267

283268
t.Run("handles multiple creates", func(t *testing.T) {
284-
doc := sqlparser.ParseString("test.sql", `
269+
doc := ParseString(t, "test.sql", `
285270
create procedure [code].Proc1 as begin select 1 end
286271
go
287272
create procedure [code].Proc2 as begin select 2 end
@@ -295,7 +280,7 @@ create procedure [code].Proc2 as begin select 2 end
295280
})
296281

297282
t.Run("handles multiple constants in same procedure", func(t *testing.T) {
298-
doc := sqlparser.ParseString("test.sql", `
283+
doc := ParseString(t, "test.sql", `
299284
declare @EnumA int = 1, @EnumB int = 2;
300285
go
301286
create procedure [code].Test as
@@ -313,7 +298,7 @@ end
313298
})
314299

315300
t.Run("preserves comments and formatting", func(t *testing.T) {
316-
doc := sqlparser.ParseString("test.sql", `
301+
doc := ParseString(t, "test.sql", `
317302
-- This is a test procedure
318303
create procedure [code].Test as
319304
begin
@@ -333,7 +318,7 @@ end
333318
})
334319

335320
t.Run("handles const and global prefixes", func(t *testing.T) {
336-
doc := sqlparser.ParseString("test.sql", `
321+
doc := ParseString(t, "test.sql", `
337322
declare @ConstValue int = 100;
338323
declare @GlobalSetting nvarchar(50) = N'test';
339324
go
@@ -385,7 +370,7 @@ func TestPreprocessString(t *testing.T) {
385370
func TestPreprocessorError(t *testing.T) {
386371
t.Run("formats error message", func(t *testing.T) {
387372
err := PreprocessorError{
388-
Pos: sqlparser.Pos{File: "test.sql", Line: 10, Col: 5},
373+
Pos: sqldocument.Pos{File: "test.sql", Line: 10, Col: 5},
389374
Message: "something went wrong",
390375
}
391376

sqlparser/mssql/document.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,16 @@ func (d *TSqlDocument) Parse(input []byte, file sqldocument.FileRef) error {
5050
s.SetInput(input)
5151
s.SetFile(file)
5252

53+
// Functions typically consume *after* the keyword that triggered their
54+
// invoication; e.g. parseCreate parses from first non-whitespace-token
55+
// *after* `create`.
56+
//
57+
// On return, `s` is positioned at the token that starts the next statement/
58+
// sub-expression. In particular trailing ';' and whitespace has been consumed.
59+
//
60+
// `s` will typically never be positioned on whitespace except in
61+
// whitespace-preserving parsing
62+
s.NextNonWhitespaceToken()
5363
err := d.ParsePragmas(s)
5464
if err != nil {
5565
d.addError(s, err.Error())

0 commit comments

Comments
 (0)