From 5427cde971ad3ca0a76eb9766f652fe43340e65e Mon Sep 17 00:00:00 2001 From: or orsatti Date: Sat, 28 Jun 2025 20:36:39 +0300 Subject: [PATCH 1/2] fix: add rtree convertor --- internal/engine/sqlite/convert.go | 35 +++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/internal/engine/sqlite/convert.go b/internal/engine/sqlite/convert.go index 29c06fb285..d59184a585 100644 --- a/internal/engine/sqlite/convert.go +++ b/internal/engine/sqlite/convert.go @@ -132,6 +132,9 @@ func (c *cc) convertCreate_virtual_table_stmtContext(n *parser.Create_virtual_ta case "fts5": // https://www.sqlite.org/fts5.html return c.convertCreate_virtual_table_fts5(n) + case "rtree": + // https://www.sqlite.org/rtree.html + return c.convertCreate_virtual_table_rtree(n) default: return todo( fmt.Sprintf("create_virtual_table. unsupported module name: %q", moduleName), @@ -140,6 +143,38 @@ func (c *cc) convertCreate_virtual_table_stmtContext(n *parser.Create_virtual_ta } } +func (c *cc) convertCreate_virtual_table_rtree(n *parser.Create_virtual_table_stmtContext) ast.Node { + stmt := &ast.CreateTableStmt{ + Name: parseTableName(n), + IfNotExists: n.EXISTS_() != nil, + } + + for i, arg := range n.AllModule_argument() { + columnExpr, ok := arg.Expr().(*parser.Expr_qualified_column_nameContext) + if !ok { + continue + } + + columnName := columnExpr.Column_name().GetText() + + col := ast.ColumnDef{ + Colname: identifier(columnName), + IsNotNull: true, + } + + // first argument in the rtree is an integer (ID) + // https://www.sqlite.org/rtree.html#column_naming_details + if i == 0 { + col.TypeName = &ast.TypeName{Name: "integer"} + } else { + col.TypeName = &ast.TypeName{Name: "real"} + } + + stmt.Cols = append(stmt.Cols, &col) + } + return stmt +} + func (c *cc) convertCreate_virtual_table_fts5(n *parser.Create_virtual_table_stmtContext) ast.Node { stmt := &ast.CreateTableStmt{ Name: parseTableName(n), From dd314ca83b01862818626dcbf261a58c50682efa Mon Sep 17 00:00:00 2001 From: or orsatti Date: Sat, 28 Jun 2025 21:30:28 +0300 Subject: [PATCH 2/2] test: rtee test cases --- .../virtual_table/sqlite/go/models.go | 14 ++++++++ .../testdata/virtual_table/sqlite/schema.sql | 35 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/internal/endtoend/testdata/virtual_table/sqlite/go/models.go b/internal/endtoend/testdata/virtual_table/sqlite/go/models.go index 880fb287f7..9ad5790f90 100644 --- a/internal/endtoend/testdata/virtual_table/sqlite/go/models.go +++ b/internal/endtoend/testdata/virtual_table/sqlite/go/models.go @@ -24,3 +24,17 @@ type TblFt struct { B string C string } + +type Weather struct { + ID int64 + Latitude float64 + Longitude float64 +} + +type WeatherRtree struct { + ID int64 + MinLang float64 + MaxLong float64 + MinLat float64 + MaxLat float64 +} diff --git a/internal/endtoend/testdata/virtual_table/sqlite/schema.sql b/internal/endtoend/testdata/virtual_table/sqlite/schema.sql index 5d3e0a3f8b..dede2dc5a3 100644 --- a/internal/endtoend/testdata/virtual_table/sqlite/schema.sql +++ b/internal/endtoend/testdata/virtual_table/sqlite/schema.sql @@ -13,3 +13,38 @@ INSERT INTO tbl VALUES(2, 'aa bb', 't', 'a', 22); INSERT INTO ft VALUES('xx cc'); INSERT INTO ft VALUES('cc bb'); + +CREATE TABLE weather ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + latitude REAL NOT NULL, + longitude REAL NOT NULL +); + + +CREATE VIRTUAL TABLE weather_rtree USING rtree( + id, + min_lang, max_long, + min_lat, max_lat +); + +CREATE TRIGGER weather_insert +AFTER INSERT + ON weather BEGIN +INSERT INTO + weather_rtree ( + id, + min_lang, + max_long, + min_lat, + max_lat + ) +VALUES + ( + NEW.id, + NEW.latitude, + NEW.latitude, + NEW.longitude, + NEW.longitude + ); + +END;