sqlite_lint: add lint checks for rowid and without rowid
This commit is contained in:
parent
560e461b00
commit
2ac9d8e775
@ -133,4 +133,63 @@ var Checks = []Check{
|
||||
return
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "forbid_rowid_on_without_rowid_table",
|
||||
Explanation: "Tables that are `without rowid` may not have a `rowid` column",
|
||||
Execute: func(s schema.Schema) (ret []CheckResult) {
|
||||
for tblName, tbl := range s.Tables {
|
||||
if !tbl.IsWithoutRowid {
|
||||
continue
|
||||
}
|
||||
for _, column := range tbl.Columns {
|
||||
if column.Name == "rowid" {
|
||||
ret = append(ret, CheckResult{
|
||||
ErrorMsg: "rowid on 'without rowid' table",
|
||||
TableName: tblName,
|
||||
ColumnName: column.Name,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "require_explicit_rowid",
|
||||
Explanation: "All tables should have an explicit `rowid integer primary key` column, unless they\n" +
|
||||
"are declared `without rowid`.",
|
||||
Execute: func(s schema.Schema) (ret []CheckResult) {
|
||||
tbl_loop:
|
||||
for tblName, tbl := range s.Tables {
|
||||
if tbl.IsWithoutRowid {
|
||||
continue
|
||||
}
|
||||
for _, column := range tbl.Columns {
|
||||
if column.Name == "rowid" {
|
||||
if !column.IsPrimaryKey {
|
||||
ret = append(ret, CheckResult{
|
||||
ErrorMsg: "`rowid` column not declared \"primary key\"",
|
||||
TableName: tblName,
|
||||
ColumnName: column.Name,
|
||||
})
|
||||
}
|
||||
if column.Type != "integer" {
|
||||
ret = append(ret, CheckResult{
|
||||
ErrorMsg: "non-integer `rowid` column",
|
||||
TableName: tblName,
|
||||
ColumnName: column.Name,
|
||||
})
|
||||
}
|
||||
continue tbl_loop
|
||||
}
|
||||
}
|
||||
ret = append(ret, CheckResult{
|
||||
ErrorMsg: "no `rowid` column",
|
||||
TableName: tblName,
|
||||
ColumnName: "",
|
||||
})
|
||||
}
|
||||
return
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
@ -20,12 +20,17 @@ func TestFailureCases(t *testing.T) {
|
||||
{"test_schemas/failure-has-ints.sql", []string{"forbid_int_type"}},
|
||||
{"test_schemas/failure-has-nulls.sql", []string{"require_not_null"}},
|
||||
{"test_schemas/failure-no-strict.sql", []string{"require_strict"}},
|
||||
{"test_schemas/failure-rowid-on-without-rowid.sql", []string{"forbid_rowid_on_without_rowid_table"}},
|
||||
{"test_schemas/failure-missing-rowid.sql", []string{"require_explicit_rowid"}},
|
||||
{"test_schemas/failure-non-integer-rowid.sql", []string{"require_explicit_rowid"}},
|
||||
{"test_schemas/failure-non-primary-key-rowid.sql", []string{"require_explicit_rowid"}},
|
||||
{"test_schemas/failure-total.sql", []string{
|
||||
"require_not_null",
|
||||
"require_explicit_primary_key",
|
||||
"forbid_int_type",
|
||||
"require_strict",
|
||||
"require_indexes_for_foreign_keys",
|
||||
"require_explicit_rowid",
|
||||
}},
|
||||
}
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@ create table stuff (
|
||||
) strict;
|
||||
|
||||
create table stuff2 (
|
||||
weird_pk integer primary key,
|
||||
rowid integer primary key,
|
||||
label text not null unique,
|
||||
stuff_id integer references stuff(rowid),
|
||||
alternative_stuff_id integer references stuff(amount)
|
||||
|
||||
@ -6,7 +6,7 @@ create table stuff (
|
||||
create index index_stuff_amount on stuff (amount);
|
||||
|
||||
create table stuff2 (
|
||||
weird_pk integer primary key,
|
||||
rowid integer primary key,
|
||||
label text not null unique,
|
||||
stuff_id int references stuff(rowid),
|
||||
alternative_stuff_id integer references stuff(amount)
|
||||
|
||||
@ -6,7 +6,7 @@ create table stuff (
|
||||
create index index_stuff_amount on stuff (amount);
|
||||
|
||||
create table stuff2 (
|
||||
weird_pk integer primary key,
|
||||
rowid integer primary key,
|
||||
label text not null unique,
|
||||
stuff_id integer references stuff(rowid),
|
||||
alternative_stuff_id integer references stuff(amount)
|
||||
|
||||
@ -6,7 +6,7 @@ create table stuff (
|
||||
create index index_stuff_amount on stuff (amount);
|
||||
|
||||
create table stuff2 (
|
||||
weird_pk integer primary key,
|
||||
rowid integer primary key,
|
||||
label text not null unique,
|
||||
stuff_id integer references stuff(rowid),
|
||||
alternative_stuff_id integer references stuff(amount)
|
||||
|
||||
@ -10,9 +10,9 @@ create table stuff2 (
|
||||
label text not null unique,
|
||||
stuff_id integer references stuff(rowid),
|
||||
alternative_stuff_id integer references stuff(amount)
|
||||
) strict;
|
||||
) strict, without rowid;
|
||||
|
||||
create table stuff3 (
|
||||
weird_pk3 integer primary key,
|
||||
rowid integer primary key,
|
||||
stuff2_id integer not null references stuff2(weird_pk)
|
||||
) strict;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user