From 182de39cb6d0ccd3065893773f2e68a5d2daa694 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Mon, 15 Dec 2025 12:00:20 +0000 Subject: [PATCH 1/2] feat(sqlite): Support NOT NULL constraints --- internal/engine/sqlite/analyzer/analyze.go | 19 +++++++++++-------- .../engine/sqlite/analyzer/analyze_test.go | 10 +++++++--- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/internal/engine/sqlite/analyzer/analyze.go b/internal/engine/sqlite/analyzer/analyze.go index 3b526816f0..92cbd162ec 100644 --- a/internal/engine/sqlite/analyzer/analyze.go +++ b/internal/engine/sqlite/analyzer/analyze.go @@ -88,18 +88,21 @@ func (a *Analyzer) Analyze(ctx context.Context, n ast.Node, query string, migrat colCount := stmt.ColumnCount() 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 != "" { + var declType string + 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) } From 95a099f875f0920007d521aca15421adbe940a66 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Mon, 15 Dec 2025 12:33:20 +0000 Subject: [PATCH 2/2] Improve declType detection. --- internal/engine/sqlite/analyzer/analyze.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/engine/sqlite/analyzer/analyze.go b/internal/engine/sqlite/analyzer/analyze.go index 92cbd162ec..9d684d4f9a 100644 --- a/internal/engine/sqlite/analyzer/analyze.go +++ b/internal/engine/sqlite/analyzer/analyze.go @@ -88,6 +88,7 @@ func (a *Analyzer) Analyze(ctx context.Context, n ast.Node, query string, migrat colCount := stmt.ColumnCount() 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) @@ -96,14 +97,13 @@ func (a *Analyzer) Analyze(ctx context.Context, n ast.Node, query string, migrat var notNull bool var dataType string if originName != "" { - var declType string declType, _, notNull, _, _, _ = a.conn.TableColumnMetadata( dbName, tableName, originName) - - // Normalize the data type - dataType = normalizeType(declType) } + // Normalize the data type + dataType = normalizeType(declType) + col := &core.Column{ Name: name, OriginalName: originName,