Skip to content

Commit d45378c

Browse files
authored
Skip Alter ADD CONSTRAINT when changing the table schema (#39)
* skip unsupported table definitions * improve test * add test * cast only if `table.Op == rel.SchemaAlter`
1 parent 6477937 commit d45378c

File tree

4 files changed

+63
-2
lines changed

4 files changed

+63
-2
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.16
44

55
require (
66
github.com/go-rel/rel v0.38.0
7-
github.com/go-rel/sql v0.12.0
7+
github.com/go-rel/sql v0.12.1-0.20221010124958-ac6e8b8d87f0
88
github.com/mattn/go-sqlite3 v1.14.15
99
github.com/stretchr/testify v1.8.0
1010
)

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ github.com/go-rel/rel v0.38.0 h1:XooFDMrzHNaZSNvH1ZrEpcn/7TvPz37z1kA66N3Ahjo=
88
github.com/go-rel/rel v0.38.0/go.mod h1:Zq18pQqXZbDh2JBCo29jgt+y90nZWkUvI+W9Ls29ans=
99
github.com/go-rel/sql v0.12.0 h1:1iIm2JgUr854TjN2C2403A9nZKH1RwbMJp09SQC4HO8=
1010
github.com/go-rel/sql v0.12.0/go.mod h1:Usxy37iCTA5aIqoJGekV4ATdCUOK5w2FiR00/VvvLJQ=
11+
github.com/go-rel/sql v0.12.1-0.20221010124958-ac6e8b8d87f0 h1:C6KJcSVP+f8ZDgDgVJiA1/2OxkuViNB6z8TpDKaBMxI=
12+
github.com/go-rel/sql v0.12.1-0.20221010124958-ac6e8b8d87f0/go.mod h1:LJHx6rhOHC4PIFFzqoR6RA7QYJ2jCOrW7spUmJq9Raw=
1113
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
1214
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
1315
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=

sqlite3.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ package sqlite3
1414

1515
import (
1616
db "database/sql"
17+
"log"
1718
"strings"
1819

1920
"github.com/go-rel/rel"
@@ -34,7 +35,7 @@ func New(database *db.DB) rel.Adapter {
3435
deleteBuilder = builder.Delete{BufferFactory: bufferFactory, Query: queryBuilder, Filter: filterBuilder}
3536
ddlBufferFactory = builder.BufferFactory{InlineValues: true, BoolTrueValue: "1", BoolFalseValue: "0", Quoter: builder.Quote{IDPrefix: "\"", IDSuffix: "\"", IDSuffixEscapeChar: "\"", ValueQuote: "'", ValueQuoteEscapeChar: "'"}}
3637
ddlQueryBuilder = builder.Query{BufferFactory: ddlBufferFactory, Filter: filterBuilder}
37-
tableBuilder = builder.Table{BufferFactory: ddlBufferFactory, ColumnMapper: columnMapper}
38+
tableBuilder = builder.Table{BufferFactory: ddlBufferFactory, ColumnMapper: columnMapper, DefinitionFilter: definitionFilter}
3839
indexBuilder = builder.Index{BufferFactory: ddlBufferFactory, Query: ddlQueryBuilder, Filter: filterBuilder, SupportFilter: true}
3940
)
4041

@@ -119,3 +120,18 @@ func columnMapper(column *rel.Column) (string, int, int) {
119120

120121
return typ, m, n
121122
}
123+
124+
func definitionFilter(table rel.Table, def rel.TableDefinition) bool {
125+
if table.Op == rel.SchemaAlter {
126+
// https://www.sqlite.org/omitted.html
127+
// > Only the RENAME TABLE, ADD COLUMN, RENAME COLUMN, and DROP COLUMN variants of the ALTER TABLE command are supported.
128+
_, ok := def.(rel.Key)
129+
if ok {
130+
log.Print("[REL] SQLite3 adapter does not support adding keys when modifying tables")
131+
132+
return false
133+
}
134+
}
135+
136+
return true
137+
}

sqlite3_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"testing"
77

88
"github.com/go-rel/rel"
9+
"github.com/go-rel/sql"
910
"github.com/go-rel/sql/specs"
1011
_ "github.com/mattn/go-sqlite3"
1112
"github.com/stretchr/testify/assert"
@@ -123,3 +124,45 @@ func TestAdapter_Exec_error(t *testing.T) {
123124
_, _, err = adapter.Exec(ctx, "error", nil)
124125
assert.NotNil(t, err)
125126
}
127+
128+
func TestAdapter_TableBuilder(t *testing.T) {
129+
adapter, err := Open(dsn())
130+
assert.Nil(t, err)
131+
defer adapter.Close()
132+
133+
tests := []struct {
134+
result string
135+
table rel.Table
136+
}{
137+
{
138+
result: `ALTER TABLE "columns" ADD COLUMN "verified" BOOL;ALTER TABLE "columns" RENAME COLUMN "string" TO "name";ALTER TABLE "columns" ;ALTER TABLE "columns" DROP COLUMN "blob";`,
139+
table: rel.Table{
140+
Op: rel.SchemaAlter,
141+
Name: "columns",
142+
Definitions: []rel.TableDefinition{
143+
rel.Column{Name: "verified", Type: rel.Bool, Op: rel.SchemaCreate},
144+
rel.Column{Name: "string", Rename: "name", Op: rel.SchemaRename},
145+
rel.Column{Name: "bool", Type: rel.Int, Op: rel.SchemaAlter},
146+
rel.Column{Name: "blob", Op: rel.SchemaDrop},
147+
148+
// unsupported and will be skipped
149+
rel.Key{Op: rel.SchemaCreate, Columns: []string{"user_id"}, Type: rel.ForeignKey, Reference: rel.ForeignKeyReference{Table: "products", Columns: []string{"id", "name"}}},
150+
},
151+
},
152+
},
153+
{
154+
result: `ALTER TABLE "table" RENAME TO "table1";`,
155+
table: rel.Table{
156+
Op: rel.SchemaRename,
157+
Name: "table",
158+
Rename: "table1",
159+
},
160+
},
161+
}
162+
163+
for _, test := range tests {
164+
t.Run(test.result, func(t *testing.T) {
165+
assert.Equal(t, test.result, adapter.(*sql.SQL).TableBuilder.Build(test.table))
166+
})
167+
}
168+
}

0 commit comments

Comments
 (0)