fix late materialization bug
This commit is contained in:
		| @ -7210,6 +7210,7 @@ int ObSelectLogPlan::if_plan_need_late_materialization(ObLogicalOperator *top, | ||||
|   ObLogSort *child_sort = NULL; | ||||
|   ObLogTableScan *table_scan = NULL; | ||||
|   ObSEArray<uint64_t, 4> used_column_ids; | ||||
|   bool contain_enumset_rowkey = false; | ||||
|   if (OB_ISNULL(top) || OB_ISNULL(stmt = get_stmt())) { | ||||
|     ret = OB_ERR_UNEXPECTED; | ||||
|     LOG_WARN("get unexpected null", K(top), K(get_stmt()), K(ret)); | ||||
| @ -7221,6 +7222,10 @@ int ObSelectLogPlan::if_plan_need_late_materialization(ObLogicalOperator *top, | ||||
|              NULL == table_scan->get_plan() || | ||||
|              NULL == child_sort) { | ||||
|     //do nothing | ||||
|   } else if (OB_FAIL(contain_enum_set_rowkeys(*table_scan, contain_enumset_rowkey))) { | ||||
|     LOG_WARN("check whether table has enumset rowkey failed", K(ret)); | ||||
|   } else if (contain_enumset_rowkey) { | ||||
|     //if there are enumset rowkeys, don't use late materialization since 'enumset_col = ?' cannot be used to extract query ranges | ||||
|   } else if (OB_FAIL(if_index_back_plan_need_late_materialization(child_sort, | ||||
|                                                                   table_scan, | ||||
|                                                                   used_column_ids, | ||||
| @ -7627,5 +7632,26 @@ int ObSelectLogPlan::check_external_table_scan(ObSelectStmt *stmt, bool &has_ext | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
| int ObSelectLogPlan::contain_enum_set_rowkeys(const ObLogTableScan &table_scan, bool &contain) { | ||||
|   int ret = OB_SUCCESS; | ||||
|   ObSEArray<ObRawExpr*, 4> table_keys; | ||||
|   contain = false; | ||||
|   if (OB_FAIL(get_rowkey_exprs(table_scan.get_table_id(), | ||||
|                               table_scan.get_ref_table_id(), | ||||
|                               table_keys))) { | ||||
|     LOG_WARN("failed to generate rowkey exprs", K(ret)); | ||||
|   } else { | ||||
|     for (int64_t i = 0; OB_SUCC(ret) && !contain && i < table_keys.count(); ++i) { | ||||
|       if (OB_ISNULL(table_keys.at(i))) { | ||||
|         ret = OB_ERR_UNEXPECTED; | ||||
|         LOG_WARN("row key is null", K(ret)); | ||||
|       } else if (ob_is_enumset_tc(table_keys.at(i)->get_result_type().get_type())) { | ||||
|         contain = true; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
| }//sql | ||||
| }//oceanbase | ||||
|  | ||||
| @ -883,6 +883,8 @@ private: | ||||
|  | ||||
|   int check_external_table_scan(ObSelectStmt *stmt, bool &has_external_table); | ||||
|  | ||||
|   int contain_enum_set_rowkeys(const ObLogTableScan &table_scan, bool &contain); | ||||
|  | ||||
|   DISALLOW_COPY_AND_ASSIGN(ObSelectLogPlan); | ||||
| }; | ||||
| }//end of namespace sql | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 obdev
					obdev