mirror of
https://github.com/MariaDB/server.git
synced 2025-02-07 06:12:18 +01:00
3a9358a410
This patch introduces a new way of handling UPDATE and DELETE commands at the top level after the parsing phase. This new way of processing update and delete statements can be seen in the implementation of the prepare() and execute() methods from the new Sql_cmd_dml class. This class derived from the Sql_cmd class can be considered as an interface class for processing such commands as SELECT, INSERT, UPDATE, DELETE and other comands manipulating data in tables. With this patch processing of update and delete statements after parsing proceeds by the following schema: - precheck of the access rights is performed for the used tables - the used tables are opened - context analysis phase is performed for the statement - the used tables are locked - the statement is optimized and executed - clean-up is performed for the statement The implementation of the method Sql_cmd_dml::execute() adheres this schema. The virtual functions of the class Sql_cmd_dml used for precheck of the access rights, context analysis, optimization and execution allow to adjust this schema for processing data manipulation statements of any types. This schema of processing data manipulation statements is taken from the current MySQL code. Moreover the definition the class Sql_cmd_dml introduced in this patch is almost a full replica of such class in the existing MySQL. However the implementation of the derived classes for update and delete statements is quite different. This implementation employs the JOIN class for all kinds of update and delete statements. It allows to perform main bulk of context analysis actions by the function JOIN::prepare(). This guarantees that characteristics and properties of the statement tree discovered for optimization phase when doing context analysis are the same for single-table and multi-table updates and deletes. With this patch the following functions are gone: mysql_prepare_update(), mysql_multi_update_prepare(), mysql_update(), mysql_multi_update(), mysql_prepare_delete(), mysql_multi_delete_prepare(), mysql_delete(). The code within these functions have been used as much as possible though. The functions mysql_test_update() and mysql_test_delete() are also not needed anymore. The method Sql_cmd_dml::prepare() serves processing - update/delete statement - PREPARE stmt FROM "<update/delete statement>" - EXECUTE stmt when stmt is prepared from update/delete statement. Approved by Oleksandr Byelkin <sanja@mariadb.com>
114 lines
4.8 KiB
Text
114 lines
4.8 KiB
Text
# suite/funcs_1/t/is_collations.test
|
|
#
|
|
# Check the layout of information_schema.collations and some
|
|
# functionality related tests.
|
|
#
|
|
# Author:
|
|
# 2008-01-23 mleich WL#4203 Reorganize and fix the data dictionary tests of
|
|
# testsuite funcs_1
|
|
# Create this script based on older scripts and new code.
|
|
#
|
|
|
|
let $is_table = COLLATIONS;
|
|
|
|
# The table INFORMATION_SCHEMA.COLLATIONS must exist
|
|
eval SHOW TABLES FROM information_schema LIKE '$is_table';
|
|
|
|
--echo #######################################################################
|
|
--echo # Testcase 3.2.1.1: INFORMATION_SCHEMA tables can be queried via SELECT
|
|
--echo #######################################################################
|
|
# Ensure that every INFORMATION_SCHEMA table can be queried with a SELECT
|
|
# statement, just as if it were an ordinary user-defined table.
|
|
#
|
|
--source suite/funcs_1/datadict/is_table_query.inc
|
|
|
|
|
|
--echo #########################################################################
|
|
--echo # Testcase 3.2.3.1: INFORMATION_SCHEMA.COLLATIONS layout
|
|
--echo #########################################################################
|
|
# Ensure that the INFORMATION_SCHEMA.COLLATIONS table has the following
|
|
# columns, in the following order:
|
|
#
|
|
# COLLATION_NAME (shows a collation name),
|
|
# CHARACTER_SET_NAME (shows the name of the character set to which the
|
|
# collation applies),
|
|
# ID (shows a numeric identifier for that collation/character set combination),
|
|
# IS_DEFAULT (shows whether the collation is the default collation for the
|
|
# character set shown),
|
|
# IS_COMPILED (indicates whether the collation is compiled into the MySQL server),
|
|
# SORTLEN (shows a value related to the amount of memory required to sort
|
|
# strings using this collation/character set combination).
|
|
#
|
|
eval DESCRIBE information_schema.$is_table;
|
|
eval SHOW CREATE TABLE information_schema.$is_table;
|
|
eval SHOW COLUMNS FROM information_schema.$is_table;
|
|
|
|
# Note: Retrieval of information within information_schema.columns about
|
|
# information_schema.collations is in is_columns_is.test.
|
|
# Retrieval of information_schema.collations content is in
|
|
# charset_collation.inc (sourced by charset_collation_*.test).
|
|
|
|
echo # Testcases 3.2.3.2 and 3.2.3.3 are checked in suite/funcs_1/t/charset_collation*.test;
|
|
|
|
--echo ########################################################################
|
|
--echo # Testcases 3.2.1.3-3.2.1.5 + 3.2.1.8-3.2.1.12: INSERT/UPDATE/DELETE and
|
|
--echo # DDL on INFORMATION_SCHEMA tables are not supported
|
|
--echo ########################################################################
|
|
# 3.2.1.3: Ensure that no user may execute an INSERT statement on any
|
|
# INFORMATION_SCHEMA table.
|
|
# 3.2.1.4: Ensure that no user may execute an UPDATE statement on any
|
|
# INFORMATION_SCHEMA table.
|
|
# 3.2.1.5: Ensure that no user may execute a DELETE statement on any
|
|
# INFORMATION_SCHEMA table.
|
|
# 3.2.1.8: Ensure that no user may create an index on an INFORMATION_SCHEMA table.
|
|
# 3.2.1.9: Ensure that no user may alter the definition of an
|
|
# INFORMATION_SCHEMA table.
|
|
# 3.2.1.10: Ensure that no user may drop an INFORMATION_SCHEMA table.
|
|
# 3.2.1.11: Ensure that no user may move an INFORMATION_SCHEMA table to any
|
|
# other database.
|
|
# 3.2.1.12: Ensure that no user may directly add to, alter, or delete any data
|
|
# in an INFORMATION_SCHEMA table.
|
|
#
|
|
--disable_warnings
|
|
DROP DATABASE IF EXISTS db_datadict;
|
|
--enable_warnings
|
|
CREATE DATABASE db_datadict;
|
|
|
|
--error ER_DBACCESS_DENIED_ERROR
|
|
INSERT INTO information_schema.collations
|
|
SELECT * FROM information_schema.collations;
|
|
--error ER_DBACCESS_DENIED_ERROR
|
|
INSERT INTO information_schema.collations
|
|
(collation_name,character_set_name,id,is_default,is_compiled,sortlen)
|
|
VALUES ( 'cp1251_bin', 'cp1251',50, '', '',0);
|
|
|
|
--error ER_DBACCESS_DENIED_ERROR,ER_NON_UPDATABLE_TABLE
|
|
UPDATE information_schema.collations SET collation_name = 'just updated';
|
|
|
|
--error ER_DBACCESS_DENIED_ERROR
|
|
DELETE FROM information_schema.collations WHERE table_name = 't1';
|
|
--error ER_DBACCESS_DENIED_ERROR
|
|
TRUNCATE information_schema.collations;
|
|
|
|
--error ER_DBACCESS_DENIED_ERROR
|
|
CREATE INDEX my_idx ON information_schema.collations(character_set_name);
|
|
|
|
--error ER_DBACCESS_DENIED_ERROR
|
|
ALTER TABLE information_schema.collations DROP PRIMARY KEY;
|
|
--error ER_DBACCESS_DENIED_ERROR
|
|
ALTER TABLE information_schema.collations ADD f1 INT;
|
|
--error ER_DBACCESS_DENIED_ERROR
|
|
ALTER TABLE information_schema.collations ENABLE KEYS;
|
|
|
|
--error ER_DBACCESS_DENIED_ERROR
|
|
DROP TABLE information_schema.collations;
|
|
|
|
--error ER_DBACCESS_DENIED_ERROR
|
|
ALTER TABLE information_schema.collations RENAME db_datadict.collations;
|
|
--error ER_DBACCESS_DENIED_ERROR
|
|
ALTER TABLE information_schema.collations
|
|
RENAME information_schema.xcollations;
|
|
|
|
# Cleanup
|
|
DROP DATABASE db_datadict;
|
|
|