mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
7517d7e112
"Process NATURAL and USING joins according to SQL:2003". * Some of the main problems fixed by the patch: - in "select *" queries the * expanded correctly according to ANSI for arbitrary natural/using joins - natural/using joins are correctly transformed into JOIN ... ON for any number/nesting of the joins. - column references are correctly resolved against natural joins of any nesting and combined with arbitrary other joins. * This patch also contains a fix for name resolution of items inside the ON condition of JOIN ... ON - in this case items must be resolved only against the JOIN operands. To support such 'local' name resolution, the patch introduces a stack of name resolution contexts used at parse time. NOTICE: - This patch is not complete in the sense that - there are 2 test cases that still do not pass - one in join.test, one in select.test. Both are marked with a comment "TODO: WL#2486". - it does not include a new test specific for the task mysql-test/include/ps_query.inc: Adjusted according to standard NATURAL/USING join semantics., mysql-test/r/bdb.result: Adjusted according to standard NATURAL/USING join semantics. mysql-test/r/derived.result: Adjusted according to standard NATURAL/USING join semantics. mysql-test/r/errors.result: The column as a whole cannot be resolved, so different error message. mysql-test/r/fulltext.result: Adjusted according to standard JOIN ... ON semantics => the ON condition can refer only to the join operands. mysql-test/r/fulltext_order_by.result: More detailed error message. mysql-test/r/innodb.result: Adjusted according to standard NATURAL/USING join semantics. This test doesn't pass completetly yet! mysql-test/r/insert_select.result: More detailed error message. mysql-test/r/join.result: Adjusted according to standard NATURAL/USING join semantics. NOTICE: there is one test case that still fails, and it is commeted out and marked with WL#2486 in the test file. mysql-test/r/join_crash.result: Adjusted according to standard NATURAL/USING join semantics. mysql-test/r/join_nested.result: Adjusted according to standard NATURAL/USING join semantics. mysql-test/r/join_outer.result: Adjusted according to standard NATURAL/USING join semantics. mysql-test/r/multi_update.result: Adjusted according to standard NATURAL/USING join semantics. mysql-test/r/null_key.result: Adjusted according to standard NATURAL/USING join semantics. mysql-test/r/order_by.result: Adjusted according to standard NATURAL/USING join semantics. mysql-test/r/ps_2myisam.result: Adjusted according to standard NATURAL/USING join semantics. mysql-test/r/ps_3innodb.result: Adjusted according to standard NATURAL/USING join semantics. mysql-test/r/ps_4heap.result: Adjusted according to standard NATURAL/USING join semantics. mysql-test/r/ps_5merge.result: Adjusted according to standard NATURAL/USING join semantics. mysql-test/r/ps_6bdb.result: Adjusted according to standard NATURAL/USING join semantics. mysql-test/r/ps_7ndb.result: Adjusted according to standard NATURAL/USING join semantics. mysql-test/r/select.result: Adjusted according to standard NATURAL/USING join semantics. NOTICE: there is one failing test case which is commented with WL#2486 in the test file. mysql-test/r/subselect.result: Adjusted according to standard NATURAL/USING join semantics. mysql-test/r/type_ranges.result: Adjusted according to standard NATURAL/USING join semantics. mysql-test/r/union.result: More detailed error message. mysql-test/t/bdb.test: Adjusted according to standard NATURAL/USING join semantics. mysql-test/t/errors.test: Adjusted according to standard NATURAL/USING join semantics. mysql-test/t/fulltext.test: Adjusted according to standard JOIN ... ON semantics => the ON condition can refer only to the join operands. mysql-test/t/fulltext_order_by.test: More detailed error message. mysql-test/t/innodb.test: Adjusted according to standard NATURAL/USING join semantics. This test doesn't pass completetly yet! mysql-test/t/insert_select.test: More detailed error message. mysql-test/t/join.test: Adjusted according to standard NATURAL/USING join semantics. NOTICE: there is one test case that still fails, and it is commeted out and marked with WL#2486 in the test file. mysql-test/t/join_crash.test: Adjusted according to standard NATURAL/USING join semantics. mysql-test/t/join_nested.test: Adjusted according to standard NATURAL/USING join semantics. mysql-test/t/join_outer.test: Adjusted according to standard NATURAL/USING join semantics. mysql-test/t/null_key.test: Adjusted according to standard NATURAL/USING join semantics. mysql-test/t/order_by.test: Adjusted according to standard NATURAL/USING join semantics. mysql-test/t/select.test: Adjusted according to standard NATURAL/USING join semantics. NOTICE: there is one test case that still fails, and it is commeted out and marked with WL#2486 in the test file. mysql-test/t/subselect.test: Adjusted according to standard NATURAL/USING join semantics. mysql-test/t/type_ranges.test: Adjusted according to standard NATURAL/USING join semantics. mysql-test/t/union.test: More detailed error message. sql/item.cc: - extra parameter to find_field_in_tables - find_field_in_real_table renamed to find_field_in_table - fixed comments/typos sql/item.h: - added [first | last]_name_resolution_table to class Name_resolution_context - commented old code - standardized formatting sql/mysql_priv.h: - refactored the find_field_in_XXX procedures, - added a new procedure for natural join table references, - renamed the find_field_in_XXX procedures to clearer names sql/sp.cc: - pass the top-most list of the FROM clause to setup_tables - extra parameter to find_field_in_tables sql/sql_acl.cc: - renamed find_field_in_table => find_field_in_table_ref - extra parameter to find_field_in_table_ref - commented old code sql/sql_base.cc: This file contains the core of the implementation of the processing of NATURAL/USING joins (WL#2486). - added many comments to old code - refactored the group of find_field_in_XXX procedures, and added a new procedure for natural joins. There is one find_field_in_XXX procedure per each type of table reference (stored table, merge view, or natural join); one meta-procedure that selects the correct one depeneding on the table reference; and one procedure that goes over a list of table referenes. - NATURAL/USING joins are processed through the procedures: mark_common_columns, store_natural_using_join_columns, store_top_level_join_columns, setup_natural_join_row_types. The entry point to processing NATURAL/USING joins is the procedure 'setup_natural_join_row_types'. - Replaced the specialized Field_iterator_XXX iterators with one generic iterator over the fields of a table reference. - Simplified 'insert_fields' and 'setup_conds' due to encapsulation of the processing of natural joins in a separate set of procedures. sql/sql_class.h: - Commented old code. sql/sql_delete.cc: - Pass the FROM clause to setup_tables. sql/sql_help.cc: - pass the end name resolution table to find_field_in_tables - adjust the list of tables for name resolution sql/sql_insert.cc: - Changed the code that saves and restores the current context to support the list of tables for name resolution - context->first_name_resolution_table, and table_list->next_name_resolution_table. Needed to support an ugly trick to resolve inserted columns only in the first table. - Added Name_resolution_context::[first | last]_name_resolution_table. - Commented old code sql/sql_lex.cc: - set select_lex.parent_lex correctly - set correct state of the current name resolution context sql/sql_lex.h: - Added a stack of name resolution contexts to support local contexts for JOIN ... ON conditions. - Commented old code. sql/sql_load.cc: - Pass the FROM clause to setup_tables. sql/sql_olap.cc: - Pass the FROM clause to setup_tables. sql/sql_parse.cc: - correctly set SELECT_LEX::parent_lex - set the first table of the current name resoltion context - added support for NATURAL/USING joins - commented old code sql/sql_select.cc: - Pass the FROM clause to setup_tables. - Pass the end table to find_field_in_tables - Improved comments sql/sql_show.cc: - Set SELECT_LEX::parent_lex. sql/sql_update.cc: - Pass the FROM clause to setup_tables. sql/sql_yacc.yy: - Added support for a stack of name resolution contexts needed to implement name resolution for JOIN ... ON. A context is pushed for each new JOIN ... ON, and popped afterwards. - Added support for NATURAL/USING joins. sql/table.cc: - Added new class Natural_join_column to hide the heterogeneous representation of column references for stored tables and for views. - Added a new list TABLE_LIST::next_name_resolution_table to support name resolution with NATURAL/USING joins. Also added other members to TABLE_LIST to support NATURAL/USING joins. - Added a generic iterator over the fields of table references of various types - class Field_iterator_table_ref sql/table.h: - Added new class Natural_join_column to hide the heterogeneous representation of column references for stored tables and for views. - Added a new list TABLE_LIST::next_name_resolution_table to support name resolution with NATURAL/USING joins. Also added other members to TABLE_LIST to support NATURAL/USING joins. - Added a generic iterator over the fields of table references of various types - class Field_iterator_table_ref tests/mysql_client_test.c: Adjusted according to standard NATURAL JOIN syntax. |
||
---|---|---|
.. | ||
examples | ||
share | ||
.cvsignore | ||
add_errmsg | ||
client_settings.h | ||
custom_conf.h | ||
derror.cc | ||
des_key_file.cc | ||
discover.cc | ||
field.cc | ||
field.h | ||
field_conv.cc | ||
filesort.cc | ||
frm_crypt.cc | ||
gen_lex_hash.cc | ||
gstream.cc | ||
gstream.h | ||
ha_berkeley.cc | ||
ha_berkeley.h | ||
ha_blackhole.cc | ||
ha_blackhole.h | ||
ha_federated.cc | ||
ha_federated.h | ||
ha_heap.cc | ||
ha_heap.h | ||
ha_innodb.cc | ||
ha_innodb.h | ||
ha_myisam.cc | ||
ha_myisam.h | ||
ha_myisammrg.cc | ||
ha_myisammrg.h | ||
ha_ndbcluster.cc | ||
ha_ndbcluster.h | ||
handler.cc | ||
handler.h | ||
hash_filo.cc | ||
hash_filo.h | ||
hostname.cc | ||
init.cc | ||
item.cc | ||
item.h | ||
item_buff.cc | ||
item_cmpfunc.cc | ||
item_cmpfunc.h | ||
item_create.cc | ||
item_create.h | ||
item_func.cc | ||
item_func.h | ||
item_geofunc.cc | ||
item_geofunc.h | ||
item_row.cc | ||
item_row.h | ||
item_strfunc.cc | ||
item_strfunc.h | ||
item_subselect.cc | ||
item_subselect.h | ||
item_sum.cc | ||
item_sum.h | ||
item_timefunc.cc | ||
item_timefunc.h | ||
item_uniq.cc | ||
item_uniq.h | ||
key.cc | ||
lex.h | ||
lex_symbol.h | ||
lock.cc | ||
log.cc | ||
log_event.cc | ||
log_event.h | ||
Makefile.am | ||
matherr.c | ||
mf_iocache.cc | ||
my_decimal.cc | ||
my_decimal.h | ||
my_lock.c | ||
mysql_priv.h | ||
mysqld.cc | ||
mysqld_suffix.h | ||
net_serv.cc | ||
nt_servc.cc | ||
nt_servc.h | ||
opt_range.cc | ||
opt_range.h | ||
opt_sum.cc | ||
parse_file.cc | ||
parse_file.h | ||
password.c | ||
procedure.cc | ||
procedure.h | ||
protocol.cc | ||
protocol.h | ||
protocol_cursor.cc | ||
records.cc | ||
repl_failsafe.cc | ||
repl_failsafe.h | ||
set_var.cc | ||
set_var.h | ||
slave.cc | ||
slave.h | ||
sp.cc | ||
sp.h | ||
sp_cache.cc | ||
sp_cache.h | ||
sp_head.cc | ||
sp_head.h | ||
sp_pcontext.cc | ||
sp_pcontext.h | ||
sp_rcontext.cc | ||
sp_rcontext.h | ||
spatial.cc | ||
spatial.h | ||
sql_acl.cc | ||
sql_acl.h | ||
sql_analyse.cc | ||
sql_analyse.h | ||
sql_base.cc | ||
sql_bitmap.h | ||
sql_cache.cc | ||
sql_cache.h | ||
sql_class.cc | ||
sql_class.h | ||
sql_client.cc | ||
sql_crypt.cc | ||
sql_crypt.h | ||
sql_db.cc | ||
sql_delete.cc | ||
sql_derived.cc | ||
sql_do.cc | ||
sql_error.cc | ||
sql_error.h | ||
sql_handler.cc | ||
sql_help.cc | ||
sql_insert.cc | ||
sql_lex.cc | ||
sql_lex.h | ||
sql_list.cc | ||
sql_list.h | ||
sql_load.cc | ||
sql_manager.cc | ||
sql_manager.h | ||
sql_map.cc | ||
sql_map.h | ||
sql_olap.cc | ||
sql_parse.cc | ||
sql_prepare.cc | ||
sql_rename.cc | ||
sql_repl.cc | ||
sql_repl.h | ||
sql_select.cc | ||
sql_select.h | ||
sql_show.cc | ||
sql_sort.h | ||
sql_state.c | ||
sql_string.cc | ||
sql_string.h | ||
sql_table.cc | ||
sql_test.cc | ||
sql_trigger.cc | ||
sql_trigger.h | ||
sql_udf.cc | ||
sql_udf.h | ||
sql_union.cc | ||
sql_update.cc | ||
sql_view.cc | ||
sql_view.h | ||
sql_yacc.yy | ||
stacktrace.c | ||
stacktrace.h | ||
strfunc.cc | ||
structs.h | ||
table.cc | ||
table.h | ||
thr_malloc.cc | ||
time.cc | ||
tzfile.h | ||
tztime.cc | ||
tztime.h | ||
udf_example.cc | ||
uniques.cc | ||
unireg.cc | ||
unireg.h | ||
watchdog_mysqld |