mirror of
https://github.com/MariaDB/server.git
synced 2025-10-07 08:19:13 +02:00
![]() This patch implements basic IDENTITY feature, with the following syntax: <col> GENERATED {ALWAYS AS | BY DEFAULT [ON NULL]} identity_props The following identity_props are recognized and saved in the table metadata, but ignored - START WITH num - INCREMENT BY num - MAXVALUE num - MINVALUE num - ORDER, NOORDER - CYCLE, NOCYCLE - NOMINVALUE, NO MINVALUE - NOMAXVALUE, NO MAXVALUE The following identity_props are newly added keywords, however they are not reserved, i.e. can be used as identifiers, column names, etc. just as before: - KEEP - SCALE - SHARD - EXTEND - NOKEEP - NOSCALE - NOSHARD - NOEXTEND The patch is designed in minimalistic manner, re-using existing AUTO_INCREMENT implementation, yet utilizing the default values evaluation mechanism. As a result, it grants usage of CHECK constraints and other table expressions: vcols, default values with identity column. Some notes: * IDENTITY is evaluated as Field's default_value. Even GENERATED ALWAYS is considered "default", since the IDENTITY expression is not determistic. * However, the GENERATED ALWAYS kind cannot be assigned in DMLs in STRICT SQL_MODE. That is, the behavior for users is like for other GENERATED ALWAYS columns. * It honors INSERT_ID and uses it, which is important for statement-based replication to work. * START WITH and INCREMENT BY are ignored. auto_increment_increment and auto_increment_offset are being followed instead, exactly as for AUTO_INCREMENT. * Since IDENTITY behaves as DEFAULT, it cannot follow NO_AUTO_VALUE_ON_ZERO and should accept user-set keyword with zeroes, even when it is off, otherwise, `default` will not work. See test "Zeroes and defaults handling". * IDENTITY column is always replicated and saved in mariadb-dump, which is guaranteed by using default_value instead of vcol_expr (vcols, even stored, are usually not replicated). * In frm, it is loaded and saved as a default expression. For that, parse_vcol_expr definition was extended to support things like GENERATED BY DEFAULT, and even GENERATED ALWAYS. That is, no EXTRA2 header had to be added. * AUTO_INCREMENT is not transformed into default_value and works completely as before. * IDENTITY should work without the key, and moreover should generate new values without repetition. If no suitable key is created by user, one is created implicitly. * New IDENTITY keyword is added as not-reserved. handler::update_auto_increment: extract a part checking for explicit value and zeroes. Invoke only for AUTO_INCREMENT. The rest is contained in handler::update_auto_increment_impl, which will be invoked by IDENTITY. Add field argument to use instead of next_number_field. Note that for IDENTITY, field is not always next_number_field (Item_default_value can create its own field). * show_create.cc: changes make it possible to output Field's default_value as GENERATED BY DEFAULT, instead of DEFAULT (expr). * Item_field::check_vcol_func_processor: allow default on IDENTITY fields (they still have AUTO_INCREMENT properties, like unireg_check) * Item_default_value::tie_field: forbid default(x) exprs. Item_default_value distinguishes `default` and `default(x)` by the vcol_assignment_ok flag. * mysql_prepare_create_table_finalize: make sure there is at least one key where IDENTITY field goes as a first key_part. If there's none - create one. Known issues: * LAST_INSERT_ID() is not working for now. Limitations: * default(identity_column), is disabled, because persistent write is not properly done in that case. |
||
---|---|---|
.. | ||
archive | ||
atomic | ||
binlog | ||
binlog_encryption | ||
client | ||
compat | ||
csv | ||
encryption | ||
engines | ||
events | ||
federated | ||
funcs_1 | ||
funcs_2 | ||
galera | ||
galera_3nodes | ||
galera_3nodes_sr | ||
galera_sr | ||
gcol | ||
handler | ||
heap | ||
innodb | ||
innodb_fts | ||
innodb_gis | ||
innodb_i_s | ||
innodb_zip | ||
jp | ||
json | ||
large_tests | ||
maria | ||
mariabackup | ||
merge | ||
mtr/t | ||
mtr2 | ||
multi_source | ||
optimizer_unfixed_bugs | ||
parts | ||
perfschema | ||
perfschema_stress | ||
period | ||
plugins | ||
roles | ||
rpl | ||
s3 | ||
sql_sequence | ||
storage_engine | ||
stress | ||
sys_vars | ||
sysschema | ||
unit | ||
vcol | ||
versioning | ||
wsrep |