mirror of
https://github.com/tursodatabase/limbo.git
synced 2025-08-04 10:08:20 +00:00
Merge 'Support Create Index' from Preston Thorpe
Closes #1193 ```console │limbo> explain create index idxp on products(price); │addr opcode p1 p2 p3 p4 p5 comment │---- ----------------- ---- ---- ---- ------------- -- ------- │0 Init 0 39 0 0 Start at 39 │1 CreateBtree 0 1 2 0 r[1]=root iDb=0 flags=2 │2 OpenWriteAsync 0 1 0 0 │3 OpenWriteAwait 0 0 0 0 │4 NewRowId 0 2 0 0 │5 String8 0 3 0 index 0 r[3]='index' │6 String8 0 4 0 idxp 0 r[4]='idxp' │7 String8 0 5 0 products 0 r[5]='products' │8 Copy 1 6 1 0 r[6]=r[1] │9 String8 0 7 0 CREATE INDEX idxp ON products (price) 0 r[7]='CREATE INDEX idxp ON products (price)' │10 MakeRecord 3 5 8 0 r[8]=mkrec(r[3..7]) │11 InsertAsync 0 8 2 0 │12 InsertAwait 0 0 0 0 │13 SorterOpen 3 1 0 k(1,B) 0 cursor=3 │14 OpenPseudo 4 9 2 0 2 columns in r[9] │15 OpenReadAsync 2 273 0 0 table=products, root=273 │16 OpenReadAwait 0 0 0 0 │17 RewindAsync 2 0 0 0 │18 RewindAwait 2 25 0 0 Rewind table products │19 Column 2 2 10 0 r[10]=products.price │20 RowId 2 11 0 0 r[11]=products.rowid │21 MakeRecord 10 2 12 0 r[12]=mkrec(r[10..11]) │22 SorterInsert 3 12 0 0 0 key=r[12] │23 NextAsync 2 0 0 0 │24 NextAwait 2 19 0 0 │25 OpenWriteAsync 1 1 0 0 │26 OpenWriteAwait 0 0 0 0 │27 SorterSort 3 33 0 0 │28 SorterData 3 13 4 0 r[13]=data │29 SeekEnd 1 0 0 0 │30 IdxInsertAsync 1 13 0 0 key=r[13] │31 IdxInsertAwait 1 0 0 0 │32 SorterNext 3 28 0 0 │33 Close 3 0 0 0 │34 Close 2 0 0 0 │35 Close 1 0 0 0 │36 ParseSchema 0 0 0 name = 'idxp' AND type = 'index' 0 name = 'idxp' AND type = 'index' │37 Close 0 0 0 0 │38 Halt 0 0 0 0 │39 Transaction 0 1 0 0 write=true │40 Goto 0 1 0 0 ``` This will create the initial index btree and insert whatever relevant records that need to be inserted, it doesn't handle the case of inserting new index keys when normal records are created afterwards. That will prob be added in next PR to keep this one concise. Limbo will properly use the index in a subsequent query:  Creating a unique index on a column that has 2 existing identical rows:  Reviewed-by: Pere Diaz Bou <pere-altea@homail.com> Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com> Closes #1199
This commit is contained in:
commit
2d3fd01f91
14 changed files with 848 additions and 138 deletions
|
@ -342,6 +342,7 @@ def test_kv():
|
|||
# first, create a normal table to ensure no issues
|
||||
limbo.execute_dot("CREATE TABLE other (a,b,c);")
|
||||
limbo.execute_dot("INSERT INTO other values (23,32,23);")
|
||||
limbo = TestLimboShell()
|
||||
limbo.run_test_fn(
|
||||
"create virtual table t using kv_store;",
|
||||
lambda res: "Virtual table module not found: kv_store" in res,
|
||||
|
@ -350,6 +351,7 @@ def test_kv():
|
|||
limbo.debug_print(
|
||||
"create virtual table t using kv_store;",
|
||||
)
|
||||
limbo.run_test_fn(".schema", lambda res: "CREATE VIRTUAL TABLE t" in res)
|
||||
limbo.run_test_fn(
|
||||
"insert into t values ('hello', 'world');",
|
||||
null,
|
||||
|
@ -496,12 +498,6 @@ def test_vfs():
|
|||
"Tested large write to testfs",
|
||||
)
|
||||
print("Tested large write to testfs")
|
||||
# Pere: I commented this out because it added an extra row that made the test test_sqlite_vfs_compat fail
|
||||
# it didn't segfault from my side so maybe this is necessary?
|
||||
# # open regular db file to ensure we don't segfault when vfs file is dropped
|
||||
# limbo.execute_dot(".open testing/vfs.db")
|
||||
# limbo.execute_dot("create table test (id integer primary key, value float);")
|
||||
# limbo.execute_dot("insert into test (value) values (1.0);")
|
||||
limbo.quit()
|
||||
|
||||
|
||||
|
@ -548,10 +544,10 @@ if __name__ == "__main__":
|
|||
test_aggregates()
|
||||
test_crypto()
|
||||
test_series()
|
||||
test_kv()
|
||||
test_ipaddr()
|
||||
test_vfs()
|
||||
test_sqlite_vfs_compat()
|
||||
test_kv()
|
||||
except Exception as e:
|
||||
print(f"Test FAILED: {e}")
|
||||
cleanup()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue