sqlite_lint: add support for FTS5 and virtual tables
This commit is contained in:
@@ -23,7 +23,10 @@ var Checks = []Check{
|
||||
Explanation: "All columns should be marked as `not null` unless they are foreign keys. (Primary keys are\n" +
|
||||
"automatically not-null, and don't need to be specified.)",
|
||||
Execute: func(s schema.Schema) (ret []CheckResult) {
|
||||
for tablename := range s.Tables {
|
||||
for tablename, tbl := range s.Tables {
|
||||
if tbl.TableType != "table" {
|
||||
continue
|
||||
}
|
||||
for _, column := range s.Tables[tablename].Columns {
|
||||
if !column.IsNotNull && !column.IsForeignKey && !column.IsPrimaryKey {
|
||||
ret = append(ret, CheckResult{
|
||||
@@ -43,7 +46,10 @@ var Checks = []Check{
|
||||
"integer, real, text, blob or any). This disallows all 'date' and 'time' column types.\n" +
|
||||
"See more: https://www.sqlite.org/stricttables.html",
|
||||
Execute: func(s schema.Schema) (ret []CheckResult) {
|
||||
for tablename := range s.Tables {
|
||||
for tablename, tbl := range s.Tables {
|
||||
if tbl.TableType != "table" {
|
||||
continue
|
||||
}
|
||||
if !s.Tables[tablename].IsStrict {
|
||||
ret = append(ret, CheckResult{
|
||||
ErrorMsg: "Table should be marked \"strict\"",
|
||||
@@ -78,7 +84,10 @@ var Checks = []Check{
|
||||
Explanation: "All tables must have a primary key. If it's rowid, it has to be named explicitly.",
|
||||
Execute: func(s schema.Schema) (ret []CheckResult) {
|
||||
tableloop:
|
||||
for tablename := range s.Tables {
|
||||
for tablename, tbl := range s.Tables {
|
||||
if tbl.TableType != "table" {
|
||||
continue
|
||||
}
|
||||
for _, column := range s.Tables[tablename].Columns {
|
||||
if column.IsPrimaryKey {
|
||||
continue tableloop
|
||||
@@ -161,6 +170,9 @@ var Checks = []Check{
|
||||
Execute: func(s schema.Schema) (ret []CheckResult) {
|
||||
tbl_loop:
|
||||
for tblName, tbl := range s.Tables {
|
||||
if tbl.TableType != "table" {
|
||||
continue
|
||||
}
|
||||
if tbl.IsWithoutRowid {
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -5,6 +5,14 @@ create table stuff (
|
||||
) strict;
|
||||
create index index_stuff_amount on stuff (amount);
|
||||
|
||||
create virtual table stuff_fts using fts5(
|
||||
data,
|
||||
content='stuff',
|
||||
content_rowid='rowid',
|
||||
tokenize='trigram'
|
||||
);
|
||||
|
||||
|
||||
create table stuff2 (
|
||||
weird_pk integer primary key,
|
||||
label text not null unique,
|
||||
|
||||
@@ -38,10 +38,10 @@ func SchemaFromDB(db *sqlx.DB) Schema {
|
||||
ret := Schema{Tables: map[string]Table{}, Indexes: map[string]Index{}}
|
||||
|
||||
var tables []Table
|
||||
PanicIf(db.Select(&tables, `select name, is_strict, is_without_rowid from tables`))
|
||||
PanicIf(db.Select(&tables, `select name, table_type, is_strict, is_without_rowid from tables`))
|
||||
for _, tbl := range tables {
|
||||
tbl.TypeName = TypenameFromTablename(tbl.TableName)
|
||||
tbl.TypeIDName = tbl.TypeName + "ID"
|
||||
tbl.GoTypeName = TypenameFromTablename(tbl.TableName)
|
||||
tbl.TypeIDName = tbl.GoTypeName + "ID"
|
||||
tbl.VarName = strings.ToLower(string(tbl.TableName[0]))
|
||||
|
||||
PanicIf(db.Select(&tbl.Columns, `select * from columns where table_name = ?`, tbl.TableName))
|
||||
|
||||
@@ -25,7 +25,7 @@ func TestParseSchema(t *testing.T) {
|
||||
|
||||
foods := schema.Tables["foods"]
|
||||
assert.Equal(foods.TableName, "foods")
|
||||
assert.Equal(foods.TypeName, "Food")
|
||||
assert.Equal(foods.GoTypeName, "Food")
|
||||
assert.Equal(foods.TypeIDName, "FoodID")
|
||||
assert.Equal(foods.IsStrict, true)
|
||||
assert.Len(foods.Columns, 20)
|
||||
|
||||
@@ -22,15 +22,22 @@ func (c Column) IsNullableForeignKey() bool {
|
||||
|
||||
// Table is a single SQLite table.
|
||||
type Table struct {
|
||||
TableName string `db:"name"`
|
||||
TableName string `db:"name"`
|
||||
|
||||
// One of "table", "view", "shadow", or "virtual"
|
||||
TableType string `db:"table_type"`
|
||||
IsStrict bool `db:"is_strict"`
|
||||
IsWithoutRowid bool `db:"is_without_rowid"`
|
||||
|
||||
Columns []Column
|
||||
|
||||
TypeIDName string
|
||||
VarName string
|
||||
TypeName string
|
||||
|
||||
// Default variable name for variables of this type to use when generating Go code
|
||||
VarName string
|
||||
|
||||
// Name of corresponding model type to be generated
|
||||
GoTypeName string
|
||||
}
|
||||
|
||||
type Index struct {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
create temporary view tables as
|
||||
select l.schema,
|
||||
l.name,
|
||||
l.type,
|
||||
l.type as table_type,
|
||||
l.wr as is_without_rowid,
|
||||
l.strict as is_strict
|
||||
from sqlite_schema s
|
||||
|
||||
Reference in New Issue
Block a user