Skip to content

Commit

Permalink
fix: parameterized query engine cache bug fix
Browse files Browse the repository at this point in the history
  • Loading branch information
jingchen2222 committed Aug 13, 2021
1 parent a464b51 commit 2d2d6d2
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 12 deletions.
33 changes: 32 additions & 1 deletion cases/query/parameterized_query.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ cases:
data: |
0, 1, 5, 1.1, 11.1, 1, 1
0, 2, 5, 2.2, 22.2, 2, 22
- id: 1
- id: 1-1
desc: 带参数的Where条件部分命中索引
mode: request-unsupport, offline-unsupport
db: db1
Expand Down Expand Up @@ -71,6 +71,37 @@ cases:
data: |
1, 4, 55, 4.4, 44.4, 2, 4444
2, 5, 55, 5.5, 55.5, 3, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- id: 1-2
desc: 带参数的Where条件部分命中索引,参数包含字符串
mode: request-unsupport, offline-unsupport
db: db1
sql: |
SELECT col0, col1, col2, col3, col4, col5, col6 FROM {0} where col6=? and col1 < ?;
parameters:
columns: [ "p1 string" , "p2 bigint" ]
rows:
- [ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 7 ]
inputs:
- schema: col0:string, col1:int64, col2:int16, col3:float, col4:double, col5:int64, col6:string
index: index1:col6:col5
data: |
0, 1, 5, 1.1, 11.1, 1, 1
0, 2, 5, 2.2, 22.2, 2, 22
1, 3, 55, 3.3, 33.3, 1, 333
1, 4, 55, 4.4, 44.4, 2, 4444
2, 5, 55, 5.5, 55.5, 3, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
2, 6, 55, 6.6, 66.6, 4, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
2, 7, 55, 7.7, 77.7, 5, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
batch_plan: |
SIMPLE_PROJECT(sources=(col0, col1, col2, col3, col4, col5, col6))
FILTER_BY(condition=col1 < ?2, left_keys=(), right_keys=(), index_keys=(?1))
DATA_PROVIDER(type=Partition, table=auto_t0, index=index1)
expect:
schema: col0:string, col1:int64, col2:int16, col3:float, col4:double, col5:int64, col6:string
order: col1
data: |
2, 5, 55, 5.5, 55.5, 3, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
2, 6, 55, 6.6, 66.6, 4, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- id: 2-1
desc: 带参数的Where条件未命中索引
mode: request-unsupport, offline-unsupport
Expand Down
7 changes: 2 additions & 5 deletions hybridse/include/vm/engine.h
Original file line number Diff line number Diff line change
Expand Up @@ -155,11 +155,6 @@ class RunSession {
return compile_info_->GetSchema();
}

/// Return query parameter schema.
virtual const Schema& GetParameterSchema() const {
return compile_info_->GetParameterSchema();
}

/// Return query schema string.
virtual const std::string& GetEncodedSchema() const {
return compile_info_->GetEncodedSchema();
Expand All @@ -185,6 +180,8 @@ class RunSession {
void SetSpName(const std::string& sp_name) { sp_name_ = sp_name; }
/// Bing the run session with specific parameter schema
void SetParameterSchema(const codec::Schema& schema) { parameter_schema_ = schema; }
/// Return query parameter schema.
virtual const Schema& GetParameterSchema() const { return parameter_schema_; }
/// Return the engine mode of this run session
EngineMode engine_mode() const { return engine_mode_; }

Expand Down
85 changes: 79 additions & 6 deletions hybridse/src/vm/engine_compile_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -67,21 +67,94 @@ TEST_F(EngineCompileTest, EngineLRUCacheTest) {
{
base::Status get_status;
BatchRunSession bsession1;
ASSERT_TRUE(engine.Get(sql, "simple_db", bsession1, get_status))
<< get_status;
ASSERT_TRUE(engine.Get(sql, "simple_db", bsession1, get_status)) << get_status;
ASSERT_EQ(get_status.code, common::kOk);
BatchRunSession bsession2;
ASSERT_TRUE(engine.Get(sql, "simple_db", bsession2, get_status));
ASSERT_EQ(get_status.code, common::kOk);
ASSERT_EQ(bsession1.GetCompileInfo().get(),
bsession2.GetCompileInfo().get());
ASSERT_EQ(bsession1.GetCompileInfo().get(), bsession2.GetCompileInfo().get());
BatchRunSession bsession3;
ASSERT_TRUE(engine.Get(sql2, "simple_db", bsession3, get_status));
ASSERT_EQ(get_status.code, common::kOk);
ASSERT_TRUE(engine.Get(sql, "simple_db", bsession2, get_status));
ASSERT_EQ(get_status.code, common::kOk);
ASSERT_NE(bsession1.GetCompileInfo().get(),
bsession2.GetCompileInfo().get());
ASSERT_NE(bsession1.GetCompileInfo().get(), bsession2.GetCompileInfo().get());
}
}

TEST_F(EngineCompileTest, EngineWithParameterizedLRUCacheTest) {
// Build Simple Catalog
auto catalog = BuildSimpleCatalog();

// database simple_db
hybridse::type::Database db;
db.set_name("simple_db");

// table t1
hybridse::type::TableDef table_def;
sqlcase::CaseSchemaMock::BuildTableDef(table_def);
table_def.set_name("t1");
::hybridse::type::IndexDef* index = table_def.add_indexes();
index->set_name("index0");
index->add_first_keys("col0");
index->set_second_key("col5");
AddTable(db, table_def);

catalog->AddDatabase(db);

// Simple Engine
EngineOptions options;
options.set_compile_only(true);
options.set_max_sql_cache_size(1);
Engine engine(catalog, options);

hybridse::codec::Schema parameter_schema;
{
auto column = parameter_schema.Add();
column->set_type(hybridse::type::kVarchar);
}
{
auto column = parameter_schema.Add();
column->set_type(hybridse::type::kInt64);
}

hybridse::codec::Schema parameter_schema2;
{
auto column = parameter_schema2.Add();
column->set_type(hybridse::type::kInt64);
}
{
auto column = parameter_schema2.Add();
column->set_type(hybridse::type::kInt64);
}
std::string sql = "select col1, col2 from t1 where col0=? and col5<?;";
std::string sql2 = "select col1, col2 as cl2 from t1 where col0=? and col5<?;";
{
base::Status get_status;
BatchRunSession bsession1;
bsession1.SetParameterSchema(parameter_schema);
ASSERT_TRUE(engine.Get(sql, "simple_db", bsession1, get_status)) << get_status;
ASSERT_EQ(get_status.code, common::kOk);
BatchRunSession bsession2;
bsession2.SetParameterSchema(parameter_schema);
ASSERT_TRUE(engine.Get(sql, "simple_db", bsession2, get_status));
ASSERT_EQ(get_status.code, common::kOk);
ASSERT_EQ(bsession1.GetCompileInfo().get(), bsession2.GetCompileInfo().get());
BatchRunSession bsession3;
bsession3.SetParameterSchema(parameter_schema);
ASSERT_TRUE(engine.Get(sql2, "simple_db", bsession3, get_status));
ASSERT_EQ(get_status.code, common::kOk);
ASSERT_TRUE(engine.Get(sql, "simple_db", bsession2, get_status));
ASSERT_EQ(get_status.code, common::kOk);
ASSERT_NE(bsession1.GetCompileInfo().get(), bsession2.GetCompileInfo().get());

BatchRunSession bsession4;
bsession4.SetParameterSchema(parameter_schema2);
ASSERT_TRUE(engine.Get(sql, "simple_db", bsession4, get_status));
ASSERT_EQ(get_status.code, common::kOk);
ASSERT_TRUE(engine.Get(sql, "simple_db", bsession2, get_status));
ASSERT_EQ(get_status.code, common::kOk);
ASSERT_NE(bsession1.GetCompileInfo().get(), bsession2.GetCompileInfo().get());
}
}

Expand Down

0 comments on commit 2d2d6d2

Please sign in to comment.