diff --git a/internal/engine/sqlite/analyzer/analyze.go b/internal/engine/sqlite/analyzer/analyze.go index 3b526816f0..9d684d4f9a 100644 --- a/internal/engine/sqlite/analyzer/analyze.go +++ b/internal/engine/sqlite/analyzer/analyze.go @@ -89,17 +89,20 @@ func (a *Analyzer) Analyze(ctx context.Context, n ast.Node, query string, migrat for i := 0; i < colCount; i++ { name := stmt.ColumnName(i) declType := stmt.ColumnDeclType(i) + dbName := stmt.ColumnDatabaseName(i) tableName := stmt.ColumnTableName(i) originName := stmt.ColumnOriginName(i) - dbName := stmt.ColumnDatabaseName(i) - - // Normalize the data type - dataType := normalizeType(declType) // Determine if column is NOT NULL - // SQLite doesn't provide this info directly from prepared statements, - // so we default to nullable (false) - notNull := false + var notNull bool + var dataType string + if originName != "" { + declType, _, notNull, _, _, _ = a.conn.TableColumnMetadata( + dbName, tableName, originName) + } + + // Normalize the data type + dataType = normalizeType(declType) col := &core.Column{ Name: name, diff --git a/internal/engine/sqlite/analyzer/analyze_test.go b/internal/engine/sqlite/analyzer/analyze_test.go index 320b692597..467f2518bb 100644 --- a/internal/engine/sqlite/analyzer/analyze_test.go +++ b/internal/engine/sqlite/analyzer/analyze_test.go @@ -40,10 +40,11 @@ func TestAnalyzer_Analyze(t *testing.T) { expectedCols := []struct { name string dataType string + notNull bool }{ - {"id", "integer"}, - {"name", "text"}, - {"email", "text"}, + {"id", "integer", false}, + {"name", "text", true}, + {"email", "text", false}, } for i, expected := range expectedCols { @@ -57,6 +58,9 @@ func TestAnalyzer_Analyze(t *testing.T) { if col.DataType != expected.dataType { t.Errorf("Column %d: expected dataType %q, got %q", i, expected.dataType, col.DataType) } + if col.NotNull != expected.notNull { + t.Errorf("Column %d: expected notNull %v, got %v", i, expected.notNull, col.NotNull) + } if col.Table == nil || col.Table.Name != "users" { t.Errorf("Column %d: expected table 'users', got %v", i, col.Table) }