1
0
mirror of https://github.com/MariaDB/server.git synced 2026-10-23 18:49:29 +03:00
Commit Graph

14 Commits

Author SHA1 Message Date
Alexander Barkov
d646e24f7f MDEV-40009 SIGSEGV in Sql_path::from_text
Problem:
- The string passed to Sql_path::from_text() could be in
  various character sets, returned by Item::val_str_ascii(),
  which is not necessarily utf8mb3.
- While the code in Sql_path::from_text() was written in the way
  that "str" was considered to be in utf8mb3.
- As as result, cs->charset() in this line:
    auto len = cs->charlen(curr, end);
  could return a negative value and the whole loop got stuck.

Changes:
- Fixing Sys_var_path::from_item() to use val_str() instead of val_str_ascii(),
  to get the original value from "item", without any conversion.
- Moving the conversion code inside Sql_path::from_text().
2026-08-12 13:25:01 +04:00
Sergei Golubchik
be67aff19b Don't implicitly search in CURRENT_SCHEMA
the intention was not to, but some code paths weren't fixed yet
2026-02-06 17:46:52 +01:00
Sergei Golubchik
13c5cab5cf change Sql_path::from_text() to take a String, not LEX_CSTRING
* use str->c_ptr() for the error message
* pass correct charset
* remove redundant parsing Table_triggers_list::check_n_load
2026-02-06 17:46:52 +01:00
Sergei Golubchik
8b1ccf6e82 fix name resolution of name1.name2()
only search in thd->db if the path includes CURRENT_SCHEMA

Also, fix a bug with recursive function calls.
2026-02-06 17:46:52 +01:00
Sergei Golubchik
22591551fb fix --path to work
complex object sysvars (plugins, time zone, path) cannot be
set by my_getopt, they have to use NO_CMD_LINE and special
code in mysqld.cc
2026-02-06 17:46:51 +01:00
Sergei Golubchik
3b14490e58 bug: current_schema is not current_schema
quoted `current_schema` is literally a schema name and must
but treated as such. because Sql_path stores all names unquoted
let's store the current_schema as an empty name, length=0.
No valid schema name can be empty.
2026-02-06 17:46:51 +01:00
Sergei Golubchik
69f401bdb6 allocate Sql_path in one memory chunk, not one per schema
because it's always allocated and freed as a whole, there is
no operation "replace one name in the middle of the path"

this needed a reworked parser to create the whole list
of names, not append one name at a time.

Fixed a bug where Sql_path::from_text() pretended it can take
a string in any charset, but was always implicitly
assuming it's in my_charset_utf8mb3_general_ci.
2026-02-06 17:46:51 +01:00
Sergei Golubchik
5b0818ee63 cleanup
* rename to follow the standard vprintf name convention
* remove `(LEX_CSTRING*) &lex_string` casts
* remove some redundant casts too
* LEX_CSTRING -> Lex_ident_db in path
* Hash_set<Sroutine_hash_entry>
* move assert out of the loop
* some comments and whitespace changes
2026-02-06 17:46:51 +01:00
Sergei Golubchik
1fa182723d do NOT prefer itself in seemingly recursive calls, follow the path 2026-02-06 17:46:51 +01:00
Sergei Golubchik
6e086ce2a3 remove Sql_path_stack and Sql_path_push
don't create a permanent stack of paths on the heap and in THD.

Do it on the stack like for sql_mode, sctx, abort_on_warning, and
other THD properties that often need to be changed temporarily.

Fix Sql_path constructor.
2026-02-06 17:46:51 +01:00
Sergei Golubchik
11210a2c05 PATH is not a chistic, it's like sql_mode, remembered implicitly per routine 2026-02-06 17:46:50 +01:00
Sergei Golubchik
d1fd168d9c remove unused arguments 2026-02-06 17:46:50 +01:00
Sergei Golubchik
8260be6408 don't backtick-quote CURRENT_SCHEMA 2026-02-06 17:46:50 +01:00
sts-kokseng.wong
19fd3c79b0 MDEV-34391 SET PATH statement
Definition
==========
Implement the SET PATH statement.
```
SET PATH 'schema1, schema2, schema3';
```

Function
--------
In MariaDB, the SQL-path will also be used to lookup packages in
package routine invocations, so the following script:

  SET PATH 'sys';
  SELECT UTL_ENCODE.BASE64_DECODE('data');

invokes SYS.UTL_ENCODE.BASE64_DECODE('data'), i.e. the function
BASE64_DECODE() in the packge UTL_ENCODE in the database SYS
(if such package and package routine exist).

MariaDB implementation details
------------------------------
The ticket's requirement stated the grammar should support delimited
identifiers with backticks or double quotes within the string quote,
ie: the single tick. A simple parser was implemented to handle this
requirement in Sql_path::from_text.

Only 16 schemas are supported per session - we do not want too many
schemas in the path anyway since it will impact performance. This also
means that the path cache is a simple static array for easier memory
management.
2026-02-06 17:46:50 +01:00