mirror of
https://github.com/tursodatabase/limbo.git
synced 2025-08-04 18:18:03 +00:00
ajust code to accommodate index_experimental feature
This commit is contained in:
parent
c060905d00
commit
2c4847210f
3 changed files with 113 additions and 109 deletions
|
@ -154,12 +154,8 @@ fn emit_compound_select(
|
||||||
(cursor_id, index.clone())
|
(cursor_id, index.clone())
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
if !schema.indexes_enabled() {
|
new_dedupe_index = true;
|
||||||
crate::bail_parse_error!("UNION not supported without indexes");
|
create_dedupe_index(program, &right_most, schema)?
|
||||||
} else {
|
|
||||||
new_dedupe_index = true;
|
|
||||||
create_dedupe_index(program, &right_most)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
plan.query_destination = QueryDestination::EphemeralIndex {
|
plan.query_destination = QueryDestination::EphemeralIndex {
|
||||||
|
@ -210,7 +206,7 @@ fn emit_compound_select(
|
||||||
target_cursor_id = Some(cursor_id);
|
target_cursor_id = Some(cursor_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
let (left_cursor_id, left_index) = create_dedupe_index(program, &right_most);
|
let (left_cursor_id, left_index) = create_dedupe_index(program, &right_most, schema)?;
|
||||||
plan.query_destination = QueryDestination::EphemeralIndex {
|
plan.query_destination = QueryDestination::EphemeralIndex {
|
||||||
cursor_id: left_cursor_id,
|
cursor_id: left_cursor_id,
|
||||||
index: left_index.clone(),
|
index: left_index.clone(),
|
||||||
|
@ -232,7 +228,7 @@ fn emit_compound_select(
|
||||||
reg_result_cols_start,
|
reg_result_cols_start,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let (right_cursor_id, right_index) = create_dedupe_index(program, &right_most);
|
let (right_cursor_id, right_index) = create_dedupe_index(program, &right_most, schema)?;
|
||||||
right_most.query_destination = QueryDestination::EphemeralIndex {
|
right_most.query_destination = QueryDestination::EphemeralIndex {
|
||||||
cursor_id: right_cursor_id,
|
cursor_id: right_cursor_id,
|
||||||
index: right_index,
|
index: right_index,
|
||||||
|
@ -265,7 +261,15 @@ fn emit_compound_select(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates an ephemeral index that will be used to deduplicate the results of any sub-selects
|
// Creates an ephemeral index that will be used to deduplicate the results of any sub-selects
|
||||||
fn create_dedupe_index(program: &mut ProgramBuilder, select: &SelectPlan) -> (usize, Arc<Index>) {
|
fn create_dedupe_index(
|
||||||
|
program: &mut ProgramBuilder,
|
||||||
|
select: &SelectPlan,
|
||||||
|
schema: &Schema
|
||||||
|
) -> crate::Result<(usize, Arc<Index>)> {
|
||||||
|
if !schema.indexes_enabled {
|
||||||
|
crate::bail_parse_error!("UNION OR INTERSECT is not supported without indexes");
|
||||||
|
}
|
||||||
|
|
||||||
let dedupe_index = Arc::new(Index {
|
let dedupe_index = Arc::new(Index {
|
||||||
columns: select
|
columns: select
|
||||||
.result_columns
|
.result_columns
|
||||||
|
@ -293,7 +297,7 @@ fn create_dedupe_index(program: &mut ProgramBuilder, select: &SelectPlan) -> (us
|
||||||
cursor_id,
|
cursor_id,
|
||||||
is_table: false,
|
is_table: false,
|
||||||
});
|
});
|
||||||
(cursor_id, dedupe_index.clone())
|
Ok((cursor_id, dedupe_index.clone()))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Emits the bytecode for reading deduplicated rows from the ephemeral index created for UNION operators.
|
/// Emits the bytecode for reading deduplicated rows from the ephemeral index created for UNION operators.
|
||||||
|
|
|
@ -336,32 +336,32 @@ if {[info exists ::env(SQLITE_EXEC)] && ($::env(SQLITE_EXEC) eq "scripts/limbo-s
|
||||||
SELECT * FROM t;
|
SELECT * FROM t;
|
||||||
} {1|100
|
} {1|100
|
||||||
2|200}
|
2|200}
|
||||||
|
|
||||||
|
do_execsql_test_on_specific_db {:memory:} insert_from_select_intersect {
|
||||||
|
CREATE TABLE t(a, b);
|
||||||
|
CREATE TABLE t1(a, b);
|
||||||
|
CREATE TABLE t2(a, b);
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES (1, 100), (2, 200);
|
||||||
|
INSERT INTO t2 VALUES (2, 200), (3, 300);
|
||||||
|
INSERT INTO t SELECT * FROM t1 INTERSECT SELECT * FROM t2;
|
||||||
|
SELECT * FROM t;
|
||||||
|
} {2|200}
|
||||||
|
|
||||||
|
do_execsql_test_on_specific_db {:memory:} insert_from_select_intersect-2 {
|
||||||
|
CREATE TABLE t(a, b);
|
||||||
|
CREATE TABLE t1(a, b);
|
||||||
|
CREATE TABLE t2(a, b);
|
||||||
|
CREATE TABLE t3(a, b);
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES (1, 100), (2, 200);
|
||||||
|
INSERT INTO t2 VALUES (2, 200), (3, 300);
|
||||||
|
INSERT INTO t3 VALUES (2, 200), (4, 400);
|
||||||
|
INSERT INTO t SELECT * FROM t1 INTERSECT SELECT * FROM t2 INTERSECT SELECT * FROM t3;
|
||||||
|
SELECT * FROM t;
|
||||||
|
} {2|200}
|
||||||
}
|
}
|
||||||
|
|
||||||
do_execsql_test_on_specific_db {:memory:} insert_from_select_intersect {
|
|
||||||
CREATE TABLE t(a, b);
|
|
||||||
CREATE TABLE t1(a, b);
|
|
||||||
CREATE TABLE t2(a, b);
|
|
||||||
|
|
||||||
INSERT INTO t1 VALUES (1, 100), (2, 200);
|
|
||||||
INSERT INTO t2 VALUES (2, 200), (3, 300);
|
|
||||||
INSERT INTO t SELECT * FROM t1 INTERSECT SELECT * FROM t2;
|
|
||||||
SELECT * FROM t;
|
|
||||||
} {2|200}
|
|
||||||
|
|
||||||
do_execsql_test_on_specific_db {:memory:} insert_from_select_intersect-2 {
|
|
||||||
CREATE TABLE t(a, b);
|
|
||||||
CREATE TABLE t1(a, b);
|
|
||||||
CREATE TABLE t2(a, b);
|
|
||||||
CREATE TABLE t3(a, b);
|
|
||||||
|
|
||||||
INSERT INTO t1 VALUES (1, 100), (2, 200);
|
|
||||||
INSERT INTO t2 VALUES (2, 200), (3, 300);
|
|
||||||
INSERT INTO t3 VALUES (2, 200), (4, 400);
|
|
||||||
INSERT INTO t SELECT * FROM t1 INTERSECT SELECT * FROM t2;
|
|
||||||
SELECT * FROM t;
|
|
||||||
} {2|200}
|
|
||||||
|
|
||||||
do_execsql_test_on_specific_db {:memory:} negative-primary-integer-key {
|
do_execsql_test_on_specific_db {:memory:} negative-primary-integer-key {
|
||||||
CREATE TABLE t(a INTEGER PRIMARY KEY);
|
CREATE TABLE t(a INTEGER PRIMARY KEY);
|
||||||
insert into t values (-2),(13);
|
insert into t values (-2),(13);
|
||||||
|
|
|
@ -359,94 +359,94 @@ if {[info exists ::env(SQLITE_EXEC)] && ($::env(SQLITE_EXEC) eq "scripts/limbo-s
|
||||||
y|y
|
y|y
|
||||||
x|x
|
x|x
|
||||||
y|y}
|
y|y}
|
||||||
}
|
|
||||||
|
|
||||||
do_execsql_test_on_specific_db {:memory:} select-intersect-1 {
|
do_execsql_test_on_specific_db {:memory:} select-intersect-1 {
|
||||||
CREATE TABLE t(x TEXT, y TEXT);
|
CREATE TABLE t(x TEXT, y TEXT);
|
||||||
CREATE TABLE u(x TEXT, y TEXT);
|
CREATE TABLE u(x TEXT, y TEXT);
|
||||||
INSERT INTO t VALUES('x','x'),('y','y');
|
INSERT INTO t VALUES('x','x'),('y','y');
|
||||||
INSERT INTO u VALUES('x','x'),('z','y');
|
INSERT INTO u VALUES('x','x'),('z','y');
|
||||||
|
|
||||||
select * from t INTERSECT select * from u;
|
select * from t INTERSECT select * from u;
|
||||||
} {x|x}
|
} {x|x}
|
||||||
|
|
||||||
do_execsql_test_on_specific_db {:memory:} select-intersect-2 {
|
do_execsql_test_on_specific_db {:memory:} select-intersect-2 {
|
||||||
CREATE TABLE t(x TEXT, y TEXT);
|
CREATE TABLE t(x TEXT, y TEXT);
|
||||||
CREATE TABLE u(x TEXT, y TEXT);
|
CREATE TABLE u(x TEXT, y TEXT);
|
||||||
CREATE TABLE v(x TEXT, y TEXT);
|
CREATE TABLE v(x TEXT, y TEXT);
|
||||||
INSERT INTO t VALUES('x','x'),('y','y');
|
INSERT INTO t VALUES('x','x'),('y','y');
|
||||||
INSERT INTO u VALUES('x','x'),('y','y');
|
INSERT INTO u VALUES('x','x'),('y','y');
|
||||||
INSERT INTO v VALUES('a','x'),('y','y');
|
INSERT INTO v VALUES('a','x'),('y','y');
|
||||||
|
|
||||||
select * from t INTERSECT select * from u INTERSECT select * from v INTERSECT select * from t;
|
select * from t INTERSECT select * from u INTERSECT select * from v INTERSECT select * from t;
|
||||||
} {y|y}
|
} {y|y}
|
||||||
|
|
||||||
do_execsql_test_on_specific_db {:memory:} select-intersect-union {
|
do_execsql_test_on_specific_db {:memory:} select-intersect-union {
|
||||||
CREATE TABLE t(x TEXT, y TEXT);
|
CREATE TABLE t(x TEXT, y TEXT);
|
||||||
CREATE TABLE u(x TEXT, y TEXT);
|
CREATE TABLE u(x TEXT, y TEXT);
|
||||||
CREATE TABLE v(x TEXT, y TEXT);
|
CREATE TABLE v(x TEXT, y TEXT);
|
||||||
INSERT INTO t VALUES('x','x'),('y','y');
|
INSERT INTO t VALUES('x','x'),('y','y');
|
||||||
INSERT INTO u VALUES('x','x'),('z','y');
|
INSERT INTO u VALUES('x','x'),('z','y');
|
||||||
INSERT INTO v VALUES('x','x'),('z','z');
|
INSERT INTO v VALUES('x','x'),('z','z');
|
||||||
|
|
||||||
select * from t INTERSECT select * from u UNION select * from v;
|
select * from t INTERSECT select * from u UNION select * from v;
|
||||||
} {x|x
|
} {x|x
|
||||||
z|z}
|
z|z}
|
||||||
|
|
||||||
do_execsql_test_on_specific_db {:memory:} select-union-intersect {
|
do_execsql_test_on_specific_db {:memory:} select-union-intersect {
|
||||||
CREATE TABLE t(x TEXT, y TEXT);
|
CREATE TABLE t(x TEXT, y TEXT);
|
||||||
CREATE TABLE u(x TEXT, y TEXT);
|
CREATE TABLE u(x TEXT, y TEXT);
|
||||||
CREATE TABLE v(x TEXT, y TEXT);
|
CREATE TABLE v(x TEXT, y TEXT);
|
||||||
INSERT INTO t VALUES('x','x'),('y','y');
|
INSERT INTO t VALUES('x','x'),('y','y');
|
||||||
INSERT INTO u VALUES('x','x'),('z','y');
|
INSERT INTO u VALUES('x','x'),('z','y');
|
||||||
INSERT INTO v VALUES('x','x'),('z','z');
|
INSERT INTO v VALUES('x','x'),('z','z');
|
||||||
|
|
||||||
select * from t UNION select * from u INTERSECT select * from v;
|
select * from t UNION select * from u INTERSECT select * from v;
|
||||||
} {x|x}
|
} {x|x}
|
||||||
|
|
||||||
do_execsql_test_on_specific_db {:memory:} select-union-all-intersect {
|
do_execsql_test_on_specific_db {:memory:} select-union-all-intersect {
|
||||||
CREATE TABLE t(x TEXT, y TEXT);
|
CREATE TABLE t(x TEXT, y TEXT);
|
||||||
CREATE TABLE u(x TEXT, y TEXT);
|
CREATE TABLE u(x TEXT, y TEXT);
|
||||||
CREATE TABLE v(x TEXT, y TEXT);
|
CREATE TABLE v(x TEXT, y TEXT);
|
||||||
INSERT INTO t VALUES('x','x'),('y','y');
|
INSERT INTO t VALUES('x','x'),('y','y');
|
||||||
INSERT INTO u VALUES('x','x'),('z','y');
|
INSERT INTO u VALUES('x','x'),('z','y');
|
||||||
INSERT INTO v VALUES('x','x'),('z','z');
|
INSERT INTO v VALUES('x','x'),('z','z');
|
||||||
|
|
||||||
select * from t UNION ALL select * from u INTERSECT select * from v;
|
select * from t UNION ALL select * from u INTERSECT select * from v;
|
||||||
} {x|x}
|
} {x|x}
|
||||||
|
|
||||||
do_execsql_test_on_specific_db {:memory:} select-intersect-union-all {
|
do_execsql_test_on_specific_db {:memory:} select-intersect-union-all {
|
||||||
CREATE TABLE t(x TEXT, y TEXT);
|
CREATE TABLE t(x TEXT, y TEXT);
|
||||||
CREATE TABLE u(x TEXT, y TEXT);
|
CREATE TABLE u(x TEXT, y TEXT);
|
||||||
CREATE TABLE v(x TEXT, y TEXT);
|
CREATE TABLE v(x TEXT, y TEXT);
|
||||||
INSERT INTO t VALUES('x','x'),('y','y');
|
INSERT INTO t VALUES('x','x'),('y','y');
|
||||||
INSERT INTO u VALUES('x','x'),('z','y');
|
INSERT INTO u VALUES('x','x'),('z','y');
|
||||||
INSERT INTO v VALUES('x','x'),('z','z');
|
INSERT INTO v VALUES('x','x'),('z','z');
|
||||||
|
|
||||||
select * from t INTERSECT select * from u UNION ALL select * from v;
|
select * from t INTERSECT select * from u UNION ALL select * from v;
|
||||||
} {x|x
|
} {x|x
|
||||||
x|x
|
x|x
|
||||||
z|z}
|
z|z}
|
||||||
|
|
||||||
do_execsql_test_on_specific_db {:memory:} select-intersect-with-limit {
|
do_execsql_test_on_specific_db {:memory:} select-intersect-with-limit {
|
||||||
CREATE TABLE t(x TEXT, y TEXT);
|
CREATE TABLE t(x TEXT, y TEXT);
|
||||||
CREATE TABLE u(x TEXT, y TEXT);
|
CREATE TABLE u(x TEXT, y TEXT);
|
||||||
INSERT INTO t VALUES('x','x'),('y','y'), ('z','z');
|
INSERT INTO t VALUES('x','x'),('y','y'), ('z','z');
|
||||||
INSERT INTO u VALUES('x','x'),('y','y'), ('z','z');
|
INSERT INTO u VALUES('x','x'),('y','y'), ('z','z');
|
||||||
|
|
||||||
select * from t INTERSECT select * from u limit 2;
|
select * from t INTERSECT select * from u limit 2;
|
||||||
} {x|x
|
} {x|x
|
||||||
y|y}
|
y|y}
|
||||||
|
|
||||||
do_execsql_test_on_specific_db {:memory:} select-intersect-union-with-limit {
|
do_execsql_test_on_specific_db {:memory:} select-intersect-union-with-limit {
|
||||||
CREATE TABLE t(x TEXT, y TEXT);
|
CREATE TABLE t(x TEXT, y TEXT);
|
||||||
CREATE TABLE u(x TEXT, y TEXT);
|
CREATE TABLE u(x TEXT, y TEXT);
|
||||||
CREATE TABLE v(x TEXT, y TEXT);
|
CREATE TABLE v(x TEXT, y TEXT);
|
||||||
INSERT INTO t VALUES('x','x'),('y','y'), ('z','z');
|
INSERT INTO t VALUES('x','x'),('y','y'), ('z','z');
|
||||||
INSERT INTO u VALUES('d','d'),('e','e'), ('z','z');
|
INSERT INTO u VALUES('d','d'),('e','e'), ('z','z');
|
||||||
INSERT INTO v VALUES('a','a'),('b','b');
|
INSERT INTO v VALUES('a','a'),('b','b');
|
||||||
|
|
||||||
select * from t INTERSECT select * from u UNION select * from v limit 3;
|
select * from t INTERSECT select * from u UNION select * from v limit 3;
|
||||||
} {a|a
|
} {a|a
|
||||||
b|b
|
b|b
|
||||||
z|z}
|
z|z}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue