1. Support limit clause push down both odbc table and mysql table. 2. Code refactor of ODBC Scan Node, change `build_connect_string` and `query_string` from BE to FE to make it easily to modify
This commit is contained in:
@ -34,9 +34,9 @@ OdbcScanNode::OdbcScanNode(ObjectPool* pool, const TPlanNode& tnode,
|
||||
: ScanNode(pool, tnode, descs),
|
||||
_is_init(false),
|
||||
_table_name(tnode.odbc_scan_node.table_name),
|
||||
_connect_string(std::move(tnode.odbc_scan_node.connect_string)),
|
||||
_query_string(std::move(tnode.odbc_scan_node.query_string)),
|
||||
_tuple_id(tnode.odbc_scan_node.tuple_id),
|
||||
_columns(tnode.odbc_scan_node.columns),
|
||||
_filters(tnode.odbc_scan_node.filters),
|
||||
_tuple_desc(nullptr) {
|
||||
}
|
||||
|
||||
@ -63,21 +63,9 @@ Status OdbcScanNode::prepare(RuntimeState* state) {
|
||||
}
|
||||
|
||||
_slot_num = _tuple_desc->slots().size();
|
||||
// get odbc table info
|
||||
const ODBCTableDescriptor* odbc_table =
|
||||
static_cast<const ODBCTableDescriptor*>(_tuple_desc->table_desc());
|
||||
|
||||
if (NULL == odbc_table) {
|
||||
return Status::InternalError("odbc table pointer is NULL.");
|
||||
}
|
||||
|
||||
_odbc_param.host = odbc_table->host();
|
||||
_odbc_param.port = odbc_table->port();
|
||||
_odbc_param.user = odbc_table->user();
|
||||
_odbc_param.passwd = odbc_table->passwd();
|
||||
_odbc_param.db = odbc_table->db();
|
||||
_odbc_param.drivier = odbc_table->driver();
|
||||
_odbc_param.type = odbc_table->type();
|
||||
_odbc_param.connect_string = std::move(_connect_string);
|
||||
_odbc_param.query_string = std::move(_query_string);
|
||||
_odbc_param.tuple_desc = _tuple_desc;
|
||||
|
||||
_odbc_scanner.reset(new (std::nothrow)ODBCScanner(_odbc_param));
|
||||
@ -119,7 +107,7 @@ Status OdbcScanNode::open(RuntimeState* state) {
|
||||
RETURN_IF_CANCELLED(state);
|
||||
SCOPED_TIMER(_runtime_profile->total_time_counter());
|
||||
RETURN_IF_ERROR(_odbc_scanner->open());
|
||||
RETURN_IF_ERROR(_odbc_scanner->query(_table_name, _columns, _filters));
|
||||
RETURN_IF_ERROR(_odbc_scanner->query());
|
||||
// check materialize slot num
|
||||
|
||||
return Status::OK();
|
||||
@ -153,11 +141,6 @@ Status OdbcScanNode::get_next(RuntimeState* state, RowBatch* row_batch, bool* eo
|
||||
SCOPED_TIMER(_runtime_profile->total_time_counter());
|
||||
SCOPED_TIMER(materialize_tuple_timer());
|
||||
|
||||
if (reached_limit()) {
|
||||
*eos = true;
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
// create new tuple buffer for row_batch
|
||||
int tuple_buffer_size = row_batch->capacity() * _tuple_desc->byte_size();
|
||||
void* tuple_buffer = _tuple_pool->allocate(tuple_buffer_size);
|
||||
@ -173,11 +156,10 @@ Status OdbcScanNode::get_next(RuntimeState* state, RowBatch* row_batch, bool* eo
|
||||
while (true) {
|
||||
RETURN_IF_CANCELLED(state);
|
||||
|
||||
if (reached_limit() || row_batch->is_full()) {
|
||||
if (row_batch->is_full()) {
|
||||
// hang on to last allocated chunk in pool, we'll keep writing into it in the
|
||||
// next get_next() call
|
||||
row_batch->tuple_data_pool()->acquire_data(_tuple_pool.get(), !reached_limit());
|
||||
*eos = reached_limit();
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
@ -238,8 +220,6 @@ Status OdbcScanNode::get_next(RuntimeState* state, RowBatch* row_batch, bool* eo
|
||||
_tuple = reinterpret_cast<Tuple*>(new_tuple);
|
||||
}
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
Status OdbcScanNode::close(RuntimeState* state) {
|
||||
|
||||
Reference in New Issue
Block a user