mirror of
https://github.com/MariaDB/server.git
synced 2025-11-08 00:28:29 +03:00
normalize_cond() translated `WHERE col` into `WHERE col<>0`
But the opetator "not equal to 0" does not necessarily exists
for all data types.
For example, the query:
SELECT * FROM t1 WHERE inet6col;
was translated to:
SELECT * FROM t1 WHERE inet6col<>0;
which further failed with this error:
ERROR : Illegal parameter data types inet6 and bigint for operation '<>'
This patch changes the translation from `col<>0` to `col IS TRUE`.
So now
SELECT * FROM t1 WHERE inet6col;
gets translated to:
SELECT * FROM t1 WHERE inet6col IS TRUE;
Details:
1. Implementing methods:
- Field_longstr::val_bool()
- Field_string::val_bool()
- Item::val_int_from_val_str()
If the input contains bad data,
these methods raise a better error message:
Truncated incorrect BOOLEAN value
Before the change, the error was:
Truncated incorrect DOUBLE value
2. Fixing normalize_cond() to generate Item_func_istrue/Item_func_isfalse
instances instead of Item_func_ne/Item_func_eq
3. Making Item_func_truth sargable, so it uses the range optimizer.
Implementing the following methods:
- get_mm_tree(), get_mm_leaf(), add_key_fields() in Item_func_truth.
- get_func_mm_tree(), for all Item_func_truth descendants.
4. Implementing the method negated_item() for all Item_func_truth
descendants, so the negated item has a chance to be sargable:
For example,
WHERE NOT col IS NOT FALSE -- this notation is not sargable
is now translated to:
WHERE col IS FALSE -- this notation is sargable
2008-02-29 Matthias Leich
=========================
1. The testsuite "funcs_1" is mostly intended for additional (compared
to the common regression tests stored in mysql-test/t) checks
of features (VIEWS, INFORMATION_SCHEMA, STORED PROCEDURES,...)
introduced with MySQL 5.0.
2. There were some extensions of this suite when new information_schema
views were introduced. But in most cases the tests for these views
were stored within the regression testsuite (mysql-test/t).
INFORMATION_SCHEMA views introduced with MySQL 5.1
==================================================
ENGINES (partially tested here)
EVENTS (partially tested here)
FILES
GLOBAL_STATUS
GLOBAL_VARIABLES
PARTITIONS
PLUGINS
PROCESSLIST (full tested here)
PROFILING
REFERENTIAL_CONSTRAINTS
SESSION_STATUS
SESSION_VARIABLES
3. Some hints for maintainers of this suite:
- SHOW TABLES ... LIKE '<pattern>'
does a case sensitive comparison between the tablename and
the pattern.
The names of the tables within the informationschema are in uppercase.
So please use something like
SHOW TABLES FOR information_schema LIKE 'TABLES'
when you intend to get the same non empty result set on OS with and
without case sensitive filesystems and default configuration.
- The name of the data dictionary is 'information_schema' (lowercase).
- Server on OS with filesystem with case sensitive filenames
(= The files 'abc' and 'Abc' can coexist.)
+ default configuration
Example of behaviour:
DROP DATABASE information_schema;
ERROR 42000: Access denied for user ... to database 'information_schema'
DROP DATABASE INFORMATION_SCHEMA;
ERROR 42000: Access denied for user ... to database 'INFORMATION_SCHEMA'
- Try to unify results by
--replace_result $engine_type <engine_to_be_tested>
if we could expect that the results for storage engine variants of a
test differ only in the engine names.
This makes future maintenance easier.
- Avoid the use of include/show_msg*.inc.
They produce "SQL" noise which annoys during server debugging and can be
easy replaced by "--echo ...".