Skip to content
Snippets Groups Projects
Verified Commit 3327c3bc authored by Denis Smirnov's avatar Denis Smirnov
Browse files

fix: mock engine sharding (was implemented for cartridge only)

After implementing cartridge sharding mock tests were mostly
useless: we didn't see how we modify SQL according to some specific
shard.

Now (in a case of the filtered buckets when we send a query to exact
shards) mock engine generates SQL for every shard. This behavior
differs from the cartridge engine that groups buckets by replicasets
first and then generated SQL for a replicaset bucket group. But the
idea of the mock engine is to detect errors but not to implement
actual Tarantool. So, lets make things simple and use this approach.
parent 91a3b7d9
No related branches found
No related tags found
1 merge request!119fix: mock engine sharding (was implemented for cartridge only)
Pipeline #8620 passed
use std::cell::RefCell;
use std::collections::HashMap;
use std::collections::{HashMap, HashSet};
use crate::collection;
use crate::errors::QueryPlannerError;
use crate::executor::bucket::Buckets;
use crate::executor::engine::cartridge::cache::lru::{LRUCache, DEFAULT_CAPACITY};
......@@ -10,6 +11,7 @@ use crate::executor::result::{BoxExecuteFormat, Value};
use crate::executor::vtable::VirtualTable;
use crate::executor::{Metadata, QueryCache};
use crate::frontend::sql::ast::AbstractSyntaxTree;
use crate::ir::helpers::RepeatableState;
use crate::ir::relation::{Column, Table, Type};
use crate::ir::value::Value as IrValue;
use crate::ir::Plan;
......@@ -219,14 +221,16 @@ impl Engine for EngineMock {
) -> Result<BoxExecuteFormat, QueryPlannerError> {
let mut result = BoxExecuteFormat::new();
let nodes = plan.get_sql_order(top_id)?;
let sql = plan.syntax_nodes_as_sql(&nodes, buckets)?;
match buckets {
Buckets::All => {
let sql = plan.syntax_nodes_as_sql(&nodes, buckets)?;
result.extend(cluster_exec_query(&sql))?;
}
Buckets::Filtered(list) => {
for bucket in list {
let bucket_set: HashSet<u64, RepeatableState> = collection! { *bucket };
let sql = plan.syntax_nodes_as_sql(&nodes, &Buckets::Filtered(bucket_set))?;
let temp_result = bucket_exec_query(*bucket, &sql);
result.extend(temp_result)?;
}
......
......@@ -132,7 +132,7 @@ fn linker_test() {
"{} {} {}",
r#"SELECT "test_space"."FIRST_NAME" as "FIRST_NAME""#,
r#"FROM "test_space""#,
r#"WHERE ("test_space"."id") in (SELECT COLUMN_2 as "identification_number" FROM (VALUES (2),(3)))"#,
r#"WHERE ("test_space"."id") in (SELECT COLUMN_1 as "identification_number" FROM (VALUES (3)))"#,
)),
],
vec![
......@@ -141,7 +141,7 @@ fn linker_test() {
"{} {} {}",
r#"SELECT "test_space"."FIRST_NAME" as "FIRST_NAME""#,
r#"FROM "test_space""#,
r#"WHERE ("test_space"."id") in (SELECT COLUMN_2 as "identification_number" FROM (VALUES (2),(3)))"#,
r#"WHERE ("test_space"."id") in (SELECT COLUMN_1 as "identification_number" FROM (VALUES (2)))"#,
)),
],
]);
......@@ -200,7 +200,7 @@ fn union_linker_test() {
r#"FROM "test_space_hist""#,
r#"WHERE ("test_space_hist"."sys_op") > (0)"#,
r#") as "t1""#,
r#"WHERE ("t1"."id") in (SELECT COLUMN_2 as "identification_number" FROM (VALUES (2),(3)))"#
r#"WHERE ("t1"."id") in (SELECT COLUMN_1 as "identification_number" FROM (VALUES (3)))"#
)
)
],
......@@ -219,7 +219,7 @@ fn union_linker_test() {
r#"FROM "test_space_hist""#,
r#"WHERE ("test_space_hist"."sys_op") > (0)"#,
r#") as "t1""#,
r#"WHERE ("t1"."id") in (SELECT COLUMN_2 as "identification_number" FROM (VALUES (2),(3)))"#
r#"WHERE ("t1"."id") in (SELECT COLUMN_1 as "identification_number" FROM (VALUES (2)))"#
)
)
],
......@@ -475,9 +475,9 @@ fn join_linker4_test() {
"{} {} {} {} {}",
r#"SELECT t1."id" as "id" FROM "test_space" as t1"#,
r#"INNER JOIN"#,
r#"(SELECT COLUMN_2 as "r_id" FROM (VALUES (1),(2))) as t2"#,
r#"(SELECT COLUMN_1 as "r_id" FROM (VALUES (2))) as t2"#,
r#"ON (t1."id") = (t2."r_id")"#,
r#"and (t1."FIRST_NAME") = (SELECT COLUMN_4 as "fn" FROM (VALUES (2),(3)))"#,
r#"and (t1."FIRST_NAME") = (SELECT COLUMN_3 as "fn" FROM (VALUES (2),(3)))"#,
)),
],
vec![
......@@ -486,9 +486,9 @@ fn join_linker4_test() {
"{} {} {} {} {}",
r#"SELECT t1."id" as "id" FROM "test_space" as t1"#,
r#"INNER JOIN"#,
r#"(SELECT COLUMN_2 as "r_id" FROM (VALUES (1),(2))) as t2"#,
r#"(SELECT COLUMN_1 as "r_id" FROM (VALUES (1))) as t2"#,
r#"ON (t1."id") = (t2."r_id")"#,
r#"and (t1."FIRST_NAME") = (SELECT COLUMN_4 as "fn" FROM (VALUES (2),(3)))"#,
r#"and (t1."FIRST_NAME") = (SELECT COLUMN_3 as "fn" FROM (VALUES (2),(3)))"#,
)),
],
]);
......@@ -545,9 +545,9 @@ fn anonymous_col_index_test() {
r#""test_space"."bucket_id" as "bucket_id""#,
r#"FROM "test_space""#,
r#"WHERE (("test_space"."id") in"#,
r#"(SELECT COLUMN_2 as "identification_number" FROM (VALUES (2),(3)))"#,
r#"(SELECT COLUMN_1 as "identification_number" FROM (VALUES (3)))"#,
r#"or ("test_space"."id") in"#,
r#"(SELECT COLUMN_4 as "identification_number" FROM (VALUES (2),(3))))"#,
r#"(SELECT COLUMN_2 as "identification_number" FROM (VALUES (3))))"#,
)),
],
vec![
......@@ -562,9 +562,9 @@ fn anonymous_col_index_test() {
r#""test_space"."bucket_id" as "bucket_id""#,
r#"FROM "test_space""#,
r#"WHERE (("test_space"."id") in"#,
r#"(SELECT COLUMN_2 as "identification_number" FROM (VALUES (2),(3)))"#,
r#"(SELECT COLUMN_1 as "identification_number" FROM (VALUES (2)))"#,
r#"or ("test_space"."id") in"#,
r#"(SELECT COLUMN_4 as "identification_number" FROM (VALUES (2),(3))))"#,
r#"(SELECT COLUMN_2 as "identification_number" FROM (VALUES (2))))"#,
)),
],
]);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment