Fix issue: Fix a bug on the index advisor: handling of missing parts of join on scene

This commit is contained in:
flyly
2021-06-04 11:27:18 +08:00
parent 79ffc91802
commit 1e2f32183b

View File

@ -868,34 +868,46 @@ void parse_join_expr(Node *item_join)
return;
}
List *l_join_fields = ((ColumnRef *)(join_cond->lexpr))->fields;
List *r_join_fields = ((ColumnRef *)(join_cond->rexpr))->fields;
char *l_table_name = find_table_name(l_join_fields);
char *r_table_name = find_table_name(r_join_fields);
char *l_field_name = find_field_name(l_join_fields);
char *r_field_name = find_field_name(r_join_fields);
List *field_value = NIL;
if (IsA(join_cond->lexpr, ColumnRef) && IsA(join_cond->rexpr, A_Const)){
// on t1.c1...
field_value = lappend(field_value, (A_Const *)join_cond->rexpr);
parse_field_expr(((ColumnRef *)join_cond->lexpr)->fields, join_cond->name, field_value);
} else if (IsA(join_cond->rexpr, ColumnRef) && IsA(join_cond->lexpr, A_Const)){
// on ...t1.c1
field_value = lappend(field_value, (A_Const *)join_cond->lexpr);
parse_field_expr(((ColumnRef *)join_cond->rexpr)->fields, join_cond->name, field_value);
} else if (IsA(join_cond->lexpr, ColumnRef) && IsA(join_cond->rexpr, ColumnRef)){
// on t1.c1 = t2.c2
List *l_join_fields = ((ColumnRef *)(join_cond->lexpr))->fields;
List *r_join_fields = ((ColumnRef *)(join_cond->rexpr))->fields;
char *l_table_name = find_table_name(l_join_fields);
char *r_table_name = find_table_name(r_join_fields);
char *l_field_name = find_field_name(l_join_fields);
char *r_field_name = find_field_name(r_join_fields);
if (!l_table_name || !r_table_name || !l_field_name || !r_field_name) {
return;
}
if (!l_table_name || !r_table_name || !l_field_name || !r_field_name) {
return;
}
TableCell *ltable = find_or_create_tblcell(l_table_name, NULL);
TableCell *rtable = find_or_create_tblcell(r_table_name, NULL);
TableCell *ltable = find_or_create_tblcell(l_table_name, NULL);
TableCell *rtable = find_or_create_tblcell(r_table_name, NULL);
if (!ltable || !rtable) {
return;
}
if (!ltable || !rtable) {
return;
}
// add join conditons
add_join_cond(ltable, l_field_name, rtable, r_field_name);
add_join_cond(rtable, r_field_name, ltable, l_field_name);
// add join conditons
add_join_cond(ltable, l_field_name, rtable, r_field_name);
add_join_cond(rtable, r_field_name, ltable, l_field_name);
// add possible drived tables
if (!list_member(g_drived_tables, ltable)) {
g_drived_tables = lappend(g_drived_tables, ltable);
}
if (!list_member(g_drived_tables, rtable)) {
g_drived_tables = lappend(g_drived_tables, rtable);
// add possible drived tables
if (!list_member(g_drived_tables, ltable)) {
g_drived_tables = lappend(g_drived_tables, ltable);
}
if (!list_member(g_drived_tables, rtable)) {
g_drived_tables = lappend(g_drived_tables, rtable);
}
}
}